最近的工作是基于premake做一个适合我们公司的C++的编译系统,了解一下已经比较成熟的CMake,是非常有参考价值的。

【CMake初印象】

CMake和premake一样,都是meta build system,可以针对不同的平台产生相应的编译系统,比如Windows上的VS Projects, Linux下的Makefile。但CMake要比premake更加成熟,这点可以从其支持的feature,使用的项目,以及完善的文档、社区支持可以看出来,premake简直就是一个小娃娃。

所以,让我来评价,CMake之于premake,最大的优势在于功能强大且久经考验,除了基本的静态库、动态库、可执行文件的创建,不同编译系统文件的产生,还支持code generation, rpath handing等等,如此所列, 另外,CMake项目已经超出一个build system的范畴了,提供了测试的CTest,打包的CPack,以及管理report,CI的CDash,俨然成了一个完整的SDLC系统。如果要很快上马一个项目,选CMake无疑是最舒心的,而选premake可能就需要一些波折了:你要么等那位作者(不错,主要就一位)加feature,要么看是不是可以弄个workaround出来(premake用lua语言,所以扩这还是很灵活的)。

而premake之于CMake,优势在于优良的基因, 不错,premake采用了业界口碑最好,代码简单优美的lua语言:灵活、优美、知识复用 - 而CMake采用的则是一个自定义的格式,劣势十分明显。当然,这不能怪CMake,它当年出生的时候,还没有lua这么好的一个选择,当时最好的嵌入式语言是tcl,而如果采用tcl的话,骂都被人骂死了。

所以,premake虽然后来,但前途还是不可限量的。

【一些不错的链接】

  • CMake Quick Reference Pages
  • CMake Tutorial
  • CMake Wiki
  • CMake FAQ
  • CMake Architecture

【编译lua】

lua的基本情况在《用premake编译lua》中已经说明,主要是三个binary,源代码在同一个src目录下,其CMakeLists.txt如下:

cmake_minimum_required (VERSION 2.6)
project (lua)  # project here actually means solution in premakeif(WIN32)add_definitions( -D_CRT_SECURE_NO_WARNINGS )
endif()# 1. lua static library
# how to rename library name?
add_library (lualib STATIC lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c lauxlib.c lbaselib.c lbitlib.c lcorolib.c ldblib.c liolib.c lmathlib.c loslib.c lstrlib.c ltablib.c loadlib.c linit.c)
set_target_properties(lualib PROPERTIES OUTPUT_NAME "lua") # rename the library output name# 2. lua interpreter
link_directories (${LUA_BINARY_DIR})
add_executable (lua lua.c)
target_link_libraries (lua lualib)
if(UNIX)target_link_libraries( lua m )
endif()# 3. lua compiler
link_directories (${LUA_BINARY_DIR})
add_executable (luac luac.c)
target_link_libraries (luac lualib)
if(UNIX)target_link_libraries( luac m )
endif()

编译的时候,最好采用out-of-source模式,将文件产生到另外一个目录下:

cd ..
mkdir build
cd build
cmake -G "Visual Studio 9 2008" ../src

文件是产生到当前目录的, 然后:

msbuild lua.sln

即可。

注意,这里对不同的系统设置,可以用:

if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")add_definitions( -D_CRT_SECURE_NO_WARNINGS )
endif(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")

或者,一种简化的方式:

if(WIN32)add_definitions( -D_CRT_SECURE_NO_WARNINGS )
endif()

而针对不同的target,则可以用set_target_properties, 这个可以用来设置编译、链接的属性,也可以改变产生的library的名字,如:

set_target_properties(lualib PROPERTIES OUTPUT_NAME "lua") # rename the library output name

因为lua的library的target名字是:liblua, 而lua的executable的target名字是lua,但我们又不同把两个project的名字都设为lua,于是把lua library称为lualib,但同时把其target设为最终的lua即可。

用CMake编译lua相关推荐

  1. Ubuntu 14.04上使用CMake编译MXNet源码操作步骤(C++)

    MXNet源码版本号为1.3.0,其它依赖库的版本号可参考:https://blog.csdn.net/fengbingchun/article/details/84997490 build.sh脚本 ...

  2. cmake编译出错:No CMAKE_CXX_COMPILER could be found.

    cmake编译出错:No CMAKE_CXX_COMPILER could be found. 错误类似: -- The CXX compiler identification is unknown- ...

  3. cmake编译安装完成后 执行cmake --version报错 bash: /usr/bin/cmake: 没有那个文件或目录

    cmake编译安装完成后 执行cmake --version报错 bash: /usr/bin/cmake: 没有那个文件或目录 cmake 没有那个目录 - 未完代码 - 博客园 因为直接使用cma ...

  4. [ c++] cmake 编译时 undefined reference to `std::cout‘ 错误的解决方案

    [ c++] cmake 编译时 undefined reference to `std::cout' 错误的解决方案 参考文章: (1)[ c++] cmake 编译时 undefined refe ...

  5. CMake编译Makefile

    以编译Libtif文件为例: 你可以用CMake编译libtiff,超简单,两个步骤. 参考文章 CharlesSimonyi,libtiff库的问题的答复 没有整理与归纳的知识,一文不值!高度概括与 ...

  6. cmake编译时支持gdb调试

    一般在调用./configure时,可以通过设置CXXFLAGS或者CFLAGS使程序可以支持调试,就是可以用GDB查看程序运行的信息,但在cmake编译时,在cmake过程和后面的make及make ...

  7. CMake编译Widget UI Qt程序

    自从CMake被引入到KDE项目的编译系统中后,CMake的使用者日益增多,Qt也不例外,除了使用QMAKE编译Qt程序外,也可以使用CMake来编译Qt程序,并且CMake在使用上更灵活,特别是大型 ...

  8. cmake重新编译matlab,ubuntu系统下cmake 编译matlab中mex文件

    cmake 编译工程具有独特的优势,特别对于复杂的工程更是如此.利用matlab直接编译mex文件时,对于文件数据多的工程时,需要列举所有文件,并且要按照依赖关系排 cmake 编译工程具有独特的优势 ...

  9. cmake 编译Release版本

    感谢作者: https://blog.csdn.net/sinat_31086489/article/details/84030871 # cmake 编译windows release 版本 在wi ...

最新文章

  1. 图书管理系统python代码课程设计报告_数据结构图书管理系统课程设计报告
  2. SQL 基础之DDL语句创建和管理表(十四)
  3. js 之 object
  4. 编程语言之父谈语言设计,龟叔大赞TypeScript
  5. 中文转数字 java_java将阿拉伯数字转换为中文数字
  6. 行云管家堡垒机的使用方法之二——新增登录凭证
  7. jquery响应式内容滑动插件bxSlider
  8. 计算机应用基础的文档,计算机应用基础
  9. MTK 驱动开发(16)---LCM 移植
  10. 灵活应对算法大赛新挑战,极清晰比赛思路你值得拥有
  11. Android 2019最新面试实战总结
  12. java工程师项目经验_java初级工程师项目经验简历范文
  13. python foo函数_python——函数
  14. 设计FMEA步骤四:失效分析
  15. MintUI(详见官方文档)
  16. 2021版小新Pro14 Ubuntu 20.04 配置指南
  17. 云呐|医院医疗的IT设备信息化资产盘点管理系统
  18. 2022江苏民丰农村商业银行社会招聘测试题及答案
  19. 2019年京东PLUS会员前端开发之路总结
  20. 读文章笔记(八):多模态情感分析数据集整理

热门文章

  1. IOS view的圆角和阴影并存
  2. [妙味Ajax]第三课:AJAX跨域解决方案:JSONP
  3. DotNetBar 中Ribbon汉化
  4. 实施质量成本管理的五项注意
  5. ubuntu忘记密码,忘记root密码的解决方法!【转载】
  6. 小故事:在缺陷中发现长处
  7. android gps导航省电,具有省电功能的gps导航系统及其省电方法
  8. pin码计算器网页版_快对作业APP下载手机版电脑版官方正式上线
  9. OpenCV图像处理(12)——保存图像到指定位置
  10. android 无网络处理布局,Android网络开发