CMake Practice 随笔
一、CMake指令
-
PROJECT
PROJECT(projectname [CXX] [C] [Java])
定义工程名称,并指定工程支持的语言。支持的语言列表是可以忽略的,默认情况下表示支持所有语言。
这个指令隐式的定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR。当采用内部编译时,两个变量所指的都是工程所在路径。
同时,cmake系统也预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,他们的值分别跟<projectname>_BINARY_DIR和<projectname>_SOURCE_DIR一致。
-
SET
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
可以用来显式的定义变量。
-
MESSAGE
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display " ...)
用于向终端输出用户定义的信息,包含三种类型:
SEND_ERROR, 产生错误,生成过程被跳过;
STATUS, 输出前缀为--的信息;
FATAL_ERROR, 立即终止所有cmake过程。
-
ADD_EXECUTABLE
ADD_EXECUTABLE(exename ${SRC_LIST})
生成一个文件名为hello的可执行文件,相关的源文件时SRC_LIST中定义的源文件列表。
${}用来引用变量。
-
ADD_SUBDIRECTORY
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放位置。EXCLUDE_FROM_ALL参数的含义是将这个目录从编译过程中排除。
可以通过SET指令重新定义EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH变量来指定最终的目标二进制的位置(指最终生成的目标文件或者最终的共享库,不包含编译生成的中间文件)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
如果是外部编译,那可执行二进制的输出路径为build/bin,库的输出路径为build/lib。
-
INSTALL
INSTALL(TARGETS target ...
[[ARCHIVE|LIBRARY|RUNTIME]
[DESTINATION <dir>]
[PERMISSIONS permissions ...]
[CONFIGURATIONS
[Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL]
] [...])
参数中的TARGETS后面跟的就是我们通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件,可能是可执行二进制、动态库、静态库。
目标类型也就相对应的有三种,ARCHIVE特指静态库,LIBRARY特指动态库,RUNTIME特指可执行目标二进制。
DESTINATION定义了安装的路径,安装后的路径为${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>。需要注意的是,如果路径以 / 开头,那么特指的是绝对路径,这时候CMAKE_INSTALL_PREFIX其实就无效了。
举个例子:
INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)
将:
可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin目录
动态库mylib安装到${CMAKE_INSTALL_PREFIX}/lib目录
静态库mystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic目录
改写好CMakeLists.txt文件后,在终端执行指令
cmake -DCMAKE_INSTALL_PREFIX=/usr .
make
make install
即可进行编译安装,安装路径为/usr,若不指定,默认路径为/usr/local
-
ADD_LIBRARY
ADD_LIBRARY(libname [SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
参数libname不需要写全,例如只需填写hello,cmake系统会自动生成libhello.X
库的类型有三种:SHARED——动态库、STATIC——静态库、MODULE——在使用dyld的系统有效
EXCLUDE_FROM_ALL参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
-
INCLUDE_DIRECTORIES
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
用于向工程添加多个特定的头文件搜索路径。
参数[AFTER|BEFORE]表示添加到当前的头文件搜索路径之后或之前,默认为AFTER。
-
LINK_DIRECTORIES
LINK_DIRECTORIES(directory1 directory2 ...)
添加非标准的共享库搜索路径。
-
TARGET_LINK_LIBRARIES
TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ...)
为target添加需要链接的共享库,target可以是一个可执行文件,也可以是共享库。