CMake常见语法学习笔记

1.list函数

语法 描述
list(LENGTH <list><output variable>) 返回list的长度
list(GET <list> <elementindex> [<element index> ...]<output variable>) 返回list中index的element到value中
list(APPEND <list><element> [<element> ...]) 添加新element到list中
list(INSERT <list><element_index> <element> [<element> ...]) 将新element插入到list中index的位置
ist(REMOVE_ITEM <list> <value>[<value> ...]) 从list中删除某个element
ist(REMOVE_AT <list><index> [<index> ...]) 从list中删除指定index的element
list(REMOVE_DUPLICATES <list>) 从list中删除重复的element
list(REVERSE <list>) 将list的内容反转
list(SORT <list>) 将list按字母顺序排序

2.string函数

语法 描述
string(FIND <string> <substring> <output_variable> [REVERSE]) 从string中查找子串substring返回子串在string中的位置,如果提供了REVERSE标记,则从string的末尾开始查找,如果没有找到则返回 -1
string(REPLACE <match_string> <replace_string> <output_variable> <input> [<input>...]) 从input中查找子串match_string替换成replace_string,并输出给output_variable
string(TOLOWER <string> <output_variable>) 将string转换成小写形式
string(TOUPPER <string> <output_variable>) 将string转换成大写形式
string(LENGTH <string> <output_variable>) 获取string的长度,输出给output_variable
string(SUBSTRING <string> <begin> <length> <output_variable>) 从string中截取begin到begin+length的子字符串,并输出给output_variable
string(STRIP <string> <output_variable>) 去除两端空白,并输出给output_variable
string(REPEAT <string> <count> <output_variable>) 将string 重复count次,并输出给output_variable
string(COMPARE LESS <string1> <string2> <output_variable>) 比较string1和string2,看string1是否小于string2,返回true/false给output_variable
string(COMPARE GREATER <string1> <string2> <output_variable>) 比较string1和string2,看string1是否大于string2,返回true/false给output_variable
string(COMPARE EQUAL <string1> <string2> <output_variable>) 比较string1和string2,看string1是否等于string2,返回true/false给output_variable
string(COMPARE NOTEQUAL <string1> <string2> <output_variable>) 比较string1和string2,看string1是否不等于string2,返回true/false给output_variable
string(COMPARE LESS_EQUAL <string1> <string2> <output_variable>) 比较string1和string2,看string1是否小于等于string2,返回true/false给output_variable
string(COMPARE GREATER_EQUAL <string1> <string2> <output_variable>) 比较string1和string2,看string1是否大于等于string2,返回true/false给output_variable

3.CMAKE_BUILD_TYPE

3.1 类型介绍

  • (1) Debug:用于在没有优化的情况下,使用带有调试符号构建库或可执行文件;
  • (2) Release:用于构建的优化的库或可执行文件,不包含调试符号;
  • (3) RelWithDebInfo:用于构建较少的优化库或可执行文件,包含调试符号;
  • (4) MinSizeRel:用于不增加目标代码大小的优化方式,来构建库或可执行文件;

3.2 CMakeLists.txt中指定

1
2
3
4
5
6
7
8
9
10
11
12
13
cmake_minimum_required(VERSION 3.1)

project(Type LANGUAGES CXX C)

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build Type" FORCE)
endif()

message(STATUS "Build type:${CMAKE_BUILD_TYPE}")
message(STATUS "Debug: ${CMAKE_CXX_FLAGS_DEBUG}")
message(STATUS "Release: ${CMAKE_CXX_FLAGS_RELEASE}")
message(STATUS "Release with Debug info:${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
message(STATUS "Minimal Release:${CMAKE_CXX_FLAGS_MINSIZEREL}")

3.3 构建过程中指定

1
2
3
4
5
6
7
8
9
10
11
12
# (a) 直接指定CMAKE_BUILD_TYPE:对于visual studio项目而言,打开后默认还是Debug;
>> cmake -DCMAKE_BUILD_TYPE=Release ..
>> cmake -DCMAKE_BUILD_TYPE=Debug ..
# (b) 指定CMAKE_CONFIGURATION_TYPES:
>> cmake .. -DCMAKE_CONFIGURATION_TYPES="Release"
>> cmake .. -DCMAKE_CONFIGURATION_TYPES="Debug"
>> cmake .. -DCMAKE_CONFIGURATION_TYPES="Release;Debug"
# (c) 配置类型
>> cmake -B build --config Release
>> cmake --build . --config Release
>> cmake -B build --config Debug
>> cmake --build . --config Debug

4.fPIC选项指定

  • (1) 构建过程中指定:
1
>> cmake -DCMAKE_CXX_FLAGS=-fPIC ..
  • (2) CMakeLists.txt文件中指定
1
2
3
4
5
6
7
8
9
# 1.设置flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")

# 2.添加编译选项
add_compile_options(-fPIC)

# 3.设置标志
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

5.add_library

语法 描述
`add_library( [STATIC SHARED
add_library(<name> OBJECT <src>...) 将源文件编译为 Object,但不链接,通常用于模块化增量编译,将每个模块都编译成一个个 Object,加快库编译效率;
add_library(<name> ALIAS <target>) target库取一个别名 name,后续可用 name指代 target
add_library(<name> INTERFACE [IMPORTED [GLOBAL]]) 这类库有属性,能 install, export和imported,但可能没有 build过程,像 纯头文件库完全针对target的设计

 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1.动态库
add_library(bar SHARED IMPORTED)
set_property(TARGET bar PROPERTY
IMPORTED_LOCATION "c:/path/to/bar.dll")
set_property(TARGET bar PROPERTY
IMPORTED_IMPLIB "c:/path/to/bar.lib")

# 2.静态库
add_library(foo STATIC IMPORTED)
set_property(TARGET foo PROPERTY
IMPORTED_LOCATION_RELEASE "/path/to/libfoo.a"
IMPORTED_LOCATION_DEBUG "/path/to/libfoo.a"
IMPORTED_LINK_INTERFACE_LIBRARIES bar # 添加依赖库bar
)

6.add_executable

  • 使用特定源文件给项目添加一个可执行文件
语法 描述
add_executable(<name> <options>... <sources>...) 使用 sources给项目添加一个名为 name的可执行文件,和 add_library一样,源文件可以当前不指定,后续通过 add_sources来进行添加
add_executable(<name> IMPORTED [GLOBAL]) 向项目导入一个可执行文件,[GLOBAL]设置是否全局可见,同样的,一般需要配合 IMPORT_LOCATION[_CONFIG]指定导入可执行文件路径进行使用
add_executable(<name> ALIAS <target>) 给可执行文件 target创建一个别名 name,注意,name需要是没有出现过的名字

7.参考资料