你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。
cmake就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。
Linux平台下使用cmake生成makefile并编译的流程如下:
1、编写cmake配置文件cmakelists.txt
2、执行命令cmake path或者ccmake path生成makefile。其中path是cmakelists所在的目录
3、使用make命令进行编译
cmake使用过程(linux平台下):
单个源文件:
1)编写源文件,如hello.cpp
2)编写CMakeLists.txt文件
格式:
#CMake最低版本号要求:
cmake_minimum_required(version 2.8)
#项目信息
project(demo) #demo是文件夹的名字,表示改项目名称是demo
#指定生成目标
add_executable(demo main.cc),将main.cc编译成一个成名为demo的可执行文件
3)在当前目录执行cmake . 得到makefile
4)再使用make命令编译得到demo
5)执行demo可执行文件即可
同一目录,多个源文件
这时候,CMakeLists.txt可以改成如下形式:
cmake_minimum_required(VERSION 2.8)
project (Demo2)
add_executable(Demo main.cc MathFunctions.cc)
唯一的改动只是在add_executable命令中增加一个MathFunction.cc,源文件,但是源文件过多时这么写费劲,可用
aux_source_directory(<dir> <variable>)实现
如:
aux_source_directory(. DIR_SRCS)
意思是当.目录下的所有源文件存入变量 DIR_SRCS中。
于是,修改add_executable(Demo ${DIR_SRCS})
多个目录,多个源文件
对于这种情况,需要分别在项目根目录demo3和math目录里个编写一个CMakeLists.txt,为了方便,我们可以先将math目录里的文件编译成静态库再由main函数调用
1)根目录中的CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project (Demo3)
#查找当前目录下的所有源文件
#并将名称保存到 DIR_SRCS变量
aux_source_directory(. DIR_SRCS)
#添加 math 子目录
add_subdirectory(math),指明本项目包含一个子目录math,这样math目录下的CmakeLists.txt文件和源代码也会被处理掉,
#指定生成目标
add_executable(Demo ${DIR_SRCS})
#添加链接库
target_link_libraries(Demo MathFunctions),指明可执行文件main需要连接一个名为MathFunctions的链接库。
子目录中的CMakeLists.txt:
#查找当前目录下的所有源文件,并将名称保存到DIR_LIB_SRCS变量
aux_source_directory(. DIR_LIB_SRCS)
#生成链接库
add_library(MathFunction ${DIR_LIB_SRCS})
在该文件中使用命令add_library将src目录中的源文件编译成静态链接库