1.cmake使用的文件是CMakeLists.txt
2.cmake中的指令是不区分大小写的,但里面的变量名,参数名,文件名是区分大小写的,建议指令全部用大写,参数之间用空格或者分号分开
3.cmake预定义了PROJECT_BINARY_DIR即编译文件产生的目录和PROJECT_SOURCE_DIR变量即工程CMakeLists.txt所在的目录
4.project(projectname [CXX] [C] [JAVA]),工程指令,隐式定义了两个变量projectname_BINARY_DIR,projectname_SOURCE_DIR,但推荐使用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,因为如果工程指令名修改了,使用的变量名也要修改,后面的支持语言列表可以省略。
5.set (name [value] [CACHE TYPE DOCSTRIG [FORCE]]) //设置变量
获取变量 ${name}
例:
set (src_list main.c 1.c 2.c) 或者 set(src_list main.c;1.c;2.c) //多个文件时用空格或者分号分隔,不能用引号引起
set(src_list "main.c 1.c 2.c") //这种写法是错误的
6.message([STATUS|SEND_ERROR|FATAL_ERROR] "message to display")//向终端输出消息,注意这里的STATUS,SEND_ERROR,FATAL_ERROR都要是大写
STATUS向终端输出前缀为--的信息
SEND_ERROR产生错误,生成过程被跳过
FATAL_ERROR立即终止所有cmake过程
7.add_executable(main.exe ${src_list})//指定生成可执行文件为main.exe 使用的文件为文件列表src_list的内容
也可以写成add_executabele(main.exe main.c 1.c 2.c),但不可以给变量src_list加双引号
add_executabele(main.exe “${src_list}”)是错误的
8.内部编译与外部编译
在当前目录中有CMakeLists.txt,还有源码文件,在当前目录执行
cmake .
make
就会产生编译好的文件还有makefile等,但文件太多,如果想删除产生的文件也比较麻烦。这就是内部编译。
在当前目录中有CMakeLists.txt和源码文件,在当前目录新建一个临时目录如build
cd build
cmake ..
make
就会在build目录里产生编译的文件,这就是外部编译。
9.include_directories(目录1 目录2)//指定工程头文件搜索目录
如INCLUDE_DIRECTORIES($ENV{WORK_DIR}/thirdparty/include/python2.6 $ENV{WORK_DIR}/thirdparty/include/uoa)
10.link_directories(目录1 目录2)//指定链接库的搜索目录
如LINK_DIRECTORIES($ENV{WORK_DIR}/thirdparty/lib $ENV{WORK_DIR}/sqlapi)
11.add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2)//指定要生成库文件
libname不需要写全为libname.so,只要写成name即可。
SHARED,动态库
STATIC,静态库
MODULE,在使用dyld的系统有效,否则被当作SHARED对待。
EXCLUDE_FROM_ALL参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
12.LIBRARY_OUTPUT_PATH 变量设置编译生成的目标库的产生目录
如SET( LIBRARY_OUTPUT_PATH ${SOURCE_DIR}/lib )//注意LIBRARY_OUTPUT_PATH必须要在add_library之前设置才有效,LIBRARY_OUTPUT_PATH和add_library必须要在同一个CMakeLists.txt中
13.EXECUTABLE_OUTPUT_PATH 变量设置编译生成的目标程序的产生目录
如SET( EXECUTABLE_OUTPUT_PATH ${SOURCE_DIR}/bin) //注意EXECUTABLE_OUTPUT_PATH必须要在add_executable之前设置才有效,EXECUTABLE_OUTPUT_PATH和add_executable必须要在同一个CMakeLists.txt中
14.TARGET_LINK_LIBRARIES(target lib1 lib2)//指定目标程序或者库在编译进要链接哪些库
如TARGET_LINK_LIBRARIES(main.exe lib1 lib2)//lib1即liblib1.so或者liblib1.a,该指令在add_library和add_executable指令之后使用
15.aux_source_directory(dir variable)//把目录下的所有源文件存储在一个变量中
16.FILE( GLOB FILES_LIST "*" )//把当前目录下所有的文件名存储到FILES_LIST中,“*”是一个匹配表达式
17.add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])//这个指令是添加子工程目录,同时可以指定生成的二进制文件目录为binary_dir,如果是外部编译则会在执行目录下产生binary_dir,如果没有指定binary_dir,则会产生source_dir。可以理解为产生source_dir并重命名。EXCLUDE_FROM_ALL表示不编译目录。二进制文件的产生可以被LIBRARY_OUTPUT_PATH,EXECUTABLE_OUTPUT_PATH重新指定。