CMake使用整理

来源:互联网 发布:三大中文期刊数据库 编辑:程序博客网 时间:2024/06/18 08:23

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

  1. 编写 CmakeLists.txt
  2. 执行命令cmake PATH或者ccmake PATH生成 Makefile ( PATH  CMakeLists.txt 所在的目录 )
  3. 使用 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中的内置命令不区分大小写。
所有的内置命令调用形式为:

  1. command(arg1 arg2 arg3 ... argn)
每个参数均以空格,或者分号分割。注:不建议使用分号分割参数.

对于变量值的引用,和直接引用这个变量本身,使用方式分别是:

  1. ${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下的相应编程工具编译时)。

终端命令窗口下,其基本操作流程为:

  1. $> ccmake directory

  2. $> cmake directory

  3. $> 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



原创粉丝点击