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中指定
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 构建过程中指定
# (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选项指定
>> cmake -DCMAKE_CXX_FLAGS=-fPIC ..
# 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(<name> [STATIC|SHARED|MODULE] [EXCLUDE_FROM_ALL] [source1] [source2] ... |
(1) 将源文件 source1, source2... 编译成名为 name 的库,这些源文件也可以后续通过 target_sources() 进行指定;(2) 库类型为 STATIC(静态库),SHARED(动态库)或MODULE(模块库) 之一,若设置库类型为 STATIC或SHARED, 这里也可以不指定,而是通过设置 BUILD_SHARED_LIBS 标志来进行设置;(3) 设置 EXECLUDE_FROM_ALL 可使得这个库被排除在 all 外,需要明确要编译才会对其进行编译;(4) 库最终输出路径为设置的 ARCHIVE_OUTPUT_DIRECTORY 、LIBRARY_OUTPUT_DIRECTORY 和 RUNTIME_OUTPUT_DIRECTORY 几个目录。 |
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.动态库
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.参考资料