CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
-
编写
CmakeLists.txt
。
-
执行命令
“
cmake PATH
”
或者
“
ccmake PATH
”
生成
Makefile ( PATH
是
CMakeLists.txt
所在的目录
)
。
-
使用
make
命令进行编译。
CMake的所有的语句都写在一个叫:CMakeLists.txt 的文件中。
CMakeLists.txt中常用指令如下:
1. cmake_minimum_required(VERSION 2.8) 检查cmake的版本,至少为2.8
2. project(helloworld) 工程名为helloworld
3. aux_source_directory(. SRC_LIST) 查找当前目录下所有的源文件并保存到SRC_LIST变量中
4. include_directories(./include ./abc) 将./include和./abc加入包含目录列表
5. link_directories(./lib) 将 ./lib加入编译器链接阶段的搜索目录列表
6. add_executable(hello $(SRC_LIST}) 使用SRC_LIST源文件列表里的文件生成一个可执行文件hello
7. add_library(hello STATIC ${SRC_LIST}) 使用SRC_LIST源文件列表里的文件生成一个静态链接库libhello.a
8. add_library(hello SHARD ${SRC_LIST}) 使用SRC_LIST源文件列表里的文件生成一个动态链接库libhello.so
9. target_link_libraries(hello a b.a c.so) 将若干库文件链接到目标hello中,target_link_libraries里的库文件的顺序符合gcc/g++链接顺序的规则,即被依赖的库放在依赖它的库的后面,如果顺序有错,链接时会报错。
10. 自定义链接选项
11. 自定义Makefile目标 target_link_libraries(<target> ... <item> ... ...) 其中<target> 必须在当前目录中被add_executable()命令或add_library()命令创建出来。
12.赋值操作SET(变量名 变量值) 比如: SET(SRC_LIST main.c t1.ct2.c)
13. SET(CMAKE_BUILD_TYPE Debug) # 设置构建类型为debug,也可设置为release。
14. add_subdirectory(src_dir [binary_dir] [EXCLUDE_FROM_ALL])
向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置,如:add_subdirectory(src)
CMake脚本的语法中没有赋值操作,无论是赋值,还是比较、判断操作,都是通过内置命令来完成的,例如"set(),math()等"。并且CMake中的内置命令不区分大小写。
所有的内置命令调用形式为:
- command(arg1 arg2 arg3 ... argn)
对于变量值的引用,和直接引用这个变量本身,使用方式分别是:
- ${varName} 和 varName
小型程序的CMakeLists.txt模板:
cmake_minimum_required(VERSION 2.8) //cmake的最低版本
project(example) //项目名
include_directories("/usr/include") //程序所需头文件的位置
link_directories("/usr/lib") //程序所需库文件的位置
add_executable(example example.cpp) //编译example.cpp生成example对象文件
target_link_libraries(example gsl) //链接libgsl.a链接库文件到example对象文件中
target_link_libraries(example gslcblas) //链接libgslcblas.a链接库文件到example对象文件中
当CMakeLists.txt文件确定后,可以用ccmake命令对相关 的变量值进行配置。这个命令必须指向CMakeLists.txt所在的目录。配置完成之后,应用cmake命令生成相应的makefile(在Unix like系统下)或者 project文件(指定用window下的相应编程工具编译时)。
终端命令窗口下,其基本操作流程为:
-
$> ccmake directory
-
$> cmake directory
-
$> make
其中directory为CMakeList.txt所在目录;
- 第一条语句用于配置编译选项,如VTK_DIR目录 ,一般这一步不需要配置,直接执行第二条语句即可,但当出现错误时,这里就需要认为配置了,这一步才真正派上用场;
- 第二条命令用于根据CMakeLists.txt生成Makefile文件;
- 第三条命令用于执行Makefile文件,编译程序,生成可执行文件;
Reference:
1.http://tzc.is-programmer.com/show/476.html
2.http://www.cnblogs.com/cbyzju/p/5180897.html
3.http://blog.csdn.net/bytxl/article/details/50635016
4.http://blog.csdn.net/bytxl/article/category/3219609这是一个系列介绍,讲了很多很细。
5. http://blog.csdn.net/bytxl/article/details/45717195用丰富的示例由简单到复杂进行说明,非常推荐。
6. http://blog.csdn.net/bytxl/article/details/46706865详细介绍了CMakelists.txt的常用指令和含义,非常推荐+1