CMake学习总结

什么是CMake?CMake的由来?做什么用的?怎么用?以及使用过程中遇到的一些问题。

大家都是知道程序是由成百上千的.h,.cpp文件通过编译器生成的,那么大量的源码文件就需要项目工程来构建和管理。windows下自然是VS开发工具,linux下使用Qt Creator,eclipse等等,但是两个不同平台上面的项目构建不能相互移植,当然Qt Creator是跨平台的工具,已经帮我们解决了好多问题。

先来说说makefile
makefile是定义了整个项目工程的编译规则——“自动化编译”,常见于linux平台下,windows平台下vs开发环境自动为你生成好“makefile”文件。linux下的Qt Creator其实也自动生成了类似于makefile的.pro文件,其他的都是linux下自己动手写makefile文件,那都是高手在炫技,现在大项目已经很少有人自己写makefile文件了。说到这里不得不说一下make。
make是什么?make是一个命令工具,是一个解释makefile中指令的工具。
前面说到写makefile文件还是比较难的,想要跨平台的话就只能在跨平台的集成开发工具里做项目工程的管理,比如QTCreator,那不依赖于集成开发工具进行代码项目工程的管理怎么做?这时候CMake就出现了。

CMake是一个跨平台的软件,能够输出各种各样的makefile或者project文件。但是随之而来的就是要编写CMakeLists.txt文件,它是CMake所依据的规则。那怎么来写CMakeLists脚本?网上教程很多。
CMake 用法导览
CMake手册详解
CMake入门指南

make makefile cmake qmake都是什么,有什么区别?
1.make执行makefile
2.Makefile是类unix环境下(比如Linux)的类似于批处理的”脚本”文件。其基本语法是: 目标+依赖+命令,只有在目标文件不存在,或目标比依赖的文件更旧,命令才会被执行。由此可见,Makefile和make可适用于任意工作,不限于编程。
3. Makefile+make可理解为类unix环境下的项目管理工具,但它太基础了,抽象程度不高,而且在windows下不太友好(针对visual studio用户),于是就有了跨平台项目管理工具cmake
4. cmake是跨平台项目管理工具,它用更抽象的语法来组织项目。虽然,仍然是目标,依赖之类的东西,但更为抽象和友好,比如你可用math表示数学库,而不需要再具体指定到底是math.dll还是libmath.so,在windows下它会支持生成visual studio的工程,在linux下它会生成Makefile,甚至它还能生成eclipse工程文件。也就是说,从同一个抽象规则出发,它为各个编译器定制工程文件。
5. cmake是抽象层次更高的项目管理工具,cmake命令执行的CMakeLists.txt文件
6. qmake是Qt专用的项目管理工具,对应的工程文件是.pro,在Linux下面它也会生成Makefile,当然,在命令行下才会需要手动执行qmake,完全可以在qtcreator这个专用的IDE下面打开.pro文件,使用qmake命令的繁琐细节不用你管了。

总结一下,make用来执行Makefile,cmake用来执行CMakeLists.txt,qmake用来处理*.pro工程文件。Makefile的抽象层次最低,cmake和qmake在Linux等环境下最后还是会生成一个Makefile。cmake和qmake支持跨平台,cmake的做法是生成指定编译器的工程文件,而qmake完全自成体系。

具体使用时,Linux下,小工程可手动写Makefile,大工程用automake来帮你生成Makefile,要想跨平台,就用cmake。如果GUI用了Qt,也可以用qmake+*.pro来管理工程,这也是跨平台的。当然,cmake中也有针对Qt的一些规则,并代替qmake帮你将qt相关的命令整理好了。

另外,需要指出的是,make和cmake主要命令只有一条,make用于处理Makefile,cmake用来转译CMakeLists.txt,而qmake是一个体系,用于支撑一个编程环境,它还包含除qmake之外的其它多条命令(比如uic,rcc,moc)。

上个简图,其中cl表示visual studio的编译器,gcc表示linux下的编译器
CMake学习总结_第1张图片
使用中遇到的问题
1.自己有一个项目要生成静态库,而这个项目又依赖于第三方的静态库,在CMakeLists文件中使用
link_directories(${LIBDir})
link_libraries(“libglog_static.lib”)
项目中怎么都加不进去。各种百度google终于在stackoverflow上找到了类似的问题
Linking” my static lib with a third-party static lib
Linking multiple static .lib files into one monolithic .lib file using VS2008 SP1 using CMake 2.8.x
cmake: include library dependencies in static lib

最终解决方案:
SET_TARGET_PROPERTIES(merged PROPERTIES
STATIC_LIBRARY_FLAGS “full\path\to\lib1.lib full\path\to\lib2.lib”)
至于SET_TARGET_PROPERTIES指令什么意思?大家自己去搜去学了。

你可能感兴趣的:(CMake)