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(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
可以用来显式的定义变量。
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display " ...)
用于向终端输出用户定义的信息,包含三种类型:
SEND_ERROR, 产生错误,生成过程被跳过;
STATUS, 输出前缀为--的信息;
FATAL_ERROR, 立即终止所有cmake过程。
ADD_EXECUTABLE(exename ${SRC_LIST})
生成一个文件名为hello的可执行文件,相关的源文件时SRC_LIST中定义的源文件列表。
${}用来引用变量。
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(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(libname [SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
参数libname不需要写全,例如只需填写hello,cmake系统会自动生成libhello.X
库的类型有三种:SHARED——动态库、STATIC——静态库、MODULE——在使用dyld的系统有效
EXCLUDE_FROM_ALL参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
原文:https://www.cnblogs.com/didada/p/12293219.html