前置技能点:
cmake是一个工具,也可以看成一门语言。
学习cmake最大的障碍在于看不懂全是大写的英文
学习cmake主要参考了《cmake practice》
不过感觉作者有些啰嗦…不重要的东西讲了半天,重要的东西却一带而过,表述得也不是特别流畅。不过还是感谢作者的分享吧 orz
cmake的定位是大型项目构建工具。
目前适用于C/C++/JAVA的项目。
可以不需要自己写makefile文件。
既然cmake可以看做一门语言,那么自然就有语法。
下面只是列举一些常用的。不常用的可以用到的时候再去查。这里也会不定期补充。
cmake的语法中,对于变量大小写敏感,对于cmake的关键字大小写不敏感,不过习惯于全部大写。
cmake有两种编译方式,一种叫in source 编译(就是直接在工程目录编译)
一种叫out of source 编译,就是在工程目录下新建build,然后在build文件夹里编译。
一般都采用out of source的方式编译,这样可以使得编译得到的结果都存放在build文件夹里,不会和源代码混在一起。
set 命令用来定义变量:
1SET(HELLO_SRC main.SOURCE_PATHc)然后就可以用 ${HELLO_SRC} 来引用这个变量了(例外:在 if 语句中,是直接使用变量名引用,而不需要 ${})。
ADD_EXECUTABLE 用来定义生成的可执行文件的名字:
1ADD_EXECUTABLE(hello SRC_LIST)表示源文件是 SRC_LIST 中定义的源文件列表,生成一个文件名为 hello 的可执行文件。
如果有多个参数,可以写成:
1ADD_EXECUTABLE(hello main.c func.c)或者
1ADD_EXECUTABLE(hello main.c;func.c)ADD_SUBDIRECTORY 指令:
1ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除,比如工程的 example,可能就需要工程构建完成后,再进入 example 目录单独进行构建(当然,你也可以通过定义依赖来解决此类问题)。
ADD_LIBRARY 指令:
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) 生成动态(共享)库。
语法为:
1ADD_LIBRARY(libname
2 [SHARED|STATIC|MODULE]
3 [EXCLUDE_FROM_ALL]
4 source1 source2 ... sourceN)常用到的是 SHARED 动态库、STATIC 静态库。
SET_TARGET_PROPERTIES:可以修改生成的库的名字
1SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")INCLUDE_DIRECTORIES:添加头文件搜寻目录
LINK_DIRECTORIES:为 target 添加非标准的共享库搜索路径