基础语法
关键字
PROJECT关键字
PROJECT(name)
指定工程名称, 默认支持所有语言
PROJECT(name CXX)
指定工程名称, 支持C++
会隐式定义两个变量
- ${name}_BINARY_DIR
- ${name}_SOURCE_DIR
修改工程名时会将这两个变量修改,可通过预定义两个变量PROJECT_BINARY_DIR
以及PROJECT_SOURCE_DIR
解决该问题
SET关键字
设定值,SET(SRC_LIST main.cpp a.cpp b.cpp)
,即设定了SEC_LIST
的值
MESSAGE关键字
输出自定义的信息,主要有三种
- SEND_ERROR,产生错误生成过程被跳过
- STAUS,显示普通的消息
- FATAL_ERROR,终止cmake过程
ADD_EXECUTABLE
生成可执行文件ADD_EXECUTABLE(target src)
ADD_SUBDIRECTORY
- 添加存放源文件的子目录,并可指定中间二进制与目标二进制的存放位置
EXECULDE_FORM_ALL
可将参数从编译中排除ADD_SUBDIRECTORY(src bin)
- 将src目录加入工程并指定编译输出(包含中间结果)路径为bin目录
- 如果不进行 bin 目录指定, 那编译结果(包含中间文件)将会存放在指定的 执行cmake命令目录下的src
关于更改二进制保存路径
SET(EXECUTABLE_OUTPUT_PATH $(PROJECT_BINARY_DIR)/bin)
SET(LIBRARY_OUTPUT_PATH $(PROJECT_BINARY_DIR)/lib)
原则
- 变量使用
${}
取值,但在 IF 语句中直接使用变量名 - 指令中的参数需使用
()
括起来,参数之间使用空格或分号分隔 - 指令大小写无关
- 如果参数中包含空格,则需要将参数使用双引号包括
安装
INSTALL:安装指令,包括二进制,动态库,静态库以及文件,目录,脚本等
CMAKE_INSTALL_PREFIX:—prefix
- 安装文件:
INSTALL(FILES file1 file2 DESTINATION dst_dir)
,将file1
以及file2
安装到dest_dir
中,其中FILES
为文件,DESTINATION
一般为:- 绝对路径
- 相对路径,即为
${CMAKE_INSTALL_PREFIX}/${DESTINATION}
,CMAKE_INSTALL_PREFIX
一般默认为/usr/local/
,可使用cmake -DCMAKE_INSTALL_PREFIX=/usr
指定该变量的值
- 安装脚本:
INSTALL(PROGRAMS abc.sh bin)
,PROGRAMS
为非目标文件的可执行程序安装 - 安装目录:
- 直接在需要安装的目录内创建CMakeList.txt,在其内写INSTALL file
INSTALL(DIRECTORY dir/ DESTINATION dst_dir)
:若为dir/
则表示将dir
目录下所有内容安装到dst_dir
下,若为dir
则表示将dir
目录本身安装到dst_dir
- 安装库文件:
INSTALL(TARGET bin_name lib_name_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
,安装二进制,静态或动态库均需要使用TARGET
,ARCHIVE
特指静态库,LIBRARY
特指动态库,RUNTIME
特指可执行的目标二进制
构建静态库与动态库
ADD_LIBRARY(lib_name SHARED ${LIB_SRC})
- lib_name:库名称
- SHARED:表示生成动态库,STATIC表示生成静态库
- LIB_SRC:源文件
同时构建静态库与动态库的方式:
使用两个名字,例如
ADD_LIBRARY(lib_name SHARED ${LIB_SRC})
ADD_LIBRARY(lib_name_static STATIC ${LIB_SRC})
使用
SET_TARGET_PROPERTIES
,设置输出名称
1
2
3
4
5
6
7
8
9
10
11
12 SET(LIB_NAME_SRC lib_src.cpp)
ADD_LIBRARY(lib_name_static STATIC ${LIBNAME_SRC})
//重命名lib_name_static为lib_name
SET_TARGET_PROPETIES(lib_name_static PROPETIES OUTPUT "lib_name")
//在构建新的目标时,会尝试清理掉其他使用使用这个名称的库,例如构建lib_name.so时会清除掉lib_name.a
SET_TARGET_PROPETIES(lib_name_static PROPETIES CLEAN_DIRECT_OUTPUT 1)
ADD_LIBRARY(lib_name SHARED ${LIBNAME_SRC})
SET_TARGET_PROPETIES(lib_name PROPETIES OUTPUT "lib_name")
SET_TARGET_PROPETIES(lib_name PROPETIES CLEAN_DIRECT_OUTPUT 1)
动态库版本号设定
SET_TARGET_PROPERTIES(lib_name PROPERTIES VERSION 1.2 SOVERSION 1)
,其中:
- VERSION:动态库版本
- SOVERSION:API版本
使用外部共享库和头文件
INCLUDE_DIRECTORIES(head_path)
,指定头文件路径
LINK_DIRECTORIES(lib_path)
,指定库路径
TARGET_LINK_LIBRARIES(bin_name lib_name)
,指定二进制lib_name
要链接的库文件
常见环境变量
CMAKE_INCLUDE_PATH
,头文件路径CMAKE_LIBRARY_PATH
,库文件路径CMAKE_BUILD_TYPE
,release or debug等