MirrorYuChen
MirrorYuChen
Published on 2024-12-03 / 39 Visits
0
0

CMake常见语法学习笔记

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选项指定

  • (1) 构建过程中指定:
>> cmake -DCMAKE_CXX_FLAGS=-fPIC ..
  • (2) CMakeLists.txt文件中指定
# 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_DIRECTORYLIBRARY_OUTPUT_DIRECTORYRUNTIME_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.参考资料


Comment