CMakeLists学习笔记(一)

常用命令

1、cmake_minimum_required

用于指定构建当前项目所需的最低CMake版本。它告诉CMake解析器,必须至少使用指定版本的CMake才能正确地构建项目。基本语法:

cmake_minimum_required(VERSION version)

2、project

用于定义和配置项目的基本信息。基本语法:

project(project_name
        [VERSION major[.minor[.patch[.tweak]]]]
        [DESCRIPTION description]
        [HOMEPAGE_URL url]
        [LANGUAGES language1 [language2 ...]]
)

其中,各个参数的含义如下: 

  • project_name:指定项目的名称。
  • VERSION:可选参数,指定项目的版本号。
  • DESCRIPTION:可选参数,指定项目的描述信息。
  • HOMEPAGE_URL:可选参数,指定项目的主页URL。
  • LANGUAGES:可选参数,指定项目所使用的编程语言,如C、C++等。如果不指定,默认为C和C++。

 示例:

project(MyProject VERSION 1.0 DESCRIPTION "my project demo" LANGUAGES C CXX)

3、set

用于设置变量的值。示例:

set(SOME_VAR "some value")

4、option

用于定义一个开关选项,允许用户在配置项目时选择是否启用某些功能或选项。这些选项通常以布尔值(ONOFF)表示。基本语法如下:

option(<option_variable> "<option_description>" <default_value>)

其中,各个参数的含义如下:

  • <option_variable>:定义的选项变量的名称。
  • "<option_description>":选项的描述文本,将在配置过程中显示给用户。
  • <default_value>:选项的默认值,可以是ONOFF

 示例:

option(FLAG "a flag" ON)

5、add_subdirectory

用于向CMake项目中添加子目录,并处理子目录中的CMakeLists.txt文件。

示例:

add_subdirectory(source)

6、include_directories

用于向CMake项目添加包含目录,以便编译器能够找到所需的头文件。

示例:

include_directories(include)

7、target_include_directories

用于为特定目标(如可执行文件、库等)添加包含目录的命令。与全局性的 include_directories 不同,target_include_directories 允许针对具体目标设置包含路径,这样做有助于更好地控制项目的模块化和依赖关系。基本语法:

target_include_directories(target 
    [SYSTEM] 
    [BEFORE | AFTER] 
    [INTERFACE | PUBLIC | PRIVATE] 
    directory1 
    [directory2 ...]
)

各个参数的含义如下:

  • target:指定要为其添加包含目录的目标(如可执行文件、库等)。
  • SYSTEM:可选参数,将目录添加到系统的包含路径中。这通常用于区分用户自定义的包含路径和系统提供的包含路径。
  • BEFORE / AFTER:可选参数,用于控制添加的目录在已有包含路径中的位置。BEFORE表示添加在已有包含路径的前面,AFTER表示添加在已有包含路径的后面。
  • INTERFACE / PUBLIC / PRIVATE:可选参数,用于指定目录的可见性。INTERFACE表示该目录将被导出到目标的接口中,对其依赖的目标可见;PUBLIC表示该目录将被导出到目标的公共部分中,对该目标的依赖方和依赖该目标的其他目标可见;PRIVATE表示该目录仅对目标自身可见,不会被导出到依赖方。

示例:

target_include_directories(${TARGET} PUBLIC ${INCLUDE_PATH})

 8、list

用于处理列表。基本语法如下:

list(LENGTH <list> <output_variable>)
list(APPEND <list> <element1> [<element2> ...])
list(INSERT <list> <index> <element1> [<element2> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)
list(GET <list> <index> <output_variable>)
list(JOIN <list> <glue> <output_variable>)
  • LENGTH: 获取列表的长度,并将结果存储到指定的变量中。
  • APPEND: 向列表末尾添加一个或多个元素。
  • INSERT: 在列表的指定位置插入一个或多个元素。
  • REMOVE_ITEM: 从列表中移除指定的元素。
  • REMOVE_AT: 从列表中移除指定位置的元素。
  • REMOVE_DUPLICATES: 移除列表中的重复元素。
  • REVERSE: 反转列表中元素的顺序。
  • SORT: 对列表中的元素进行排序。
  • GET: 获取列表中指定位置的元素,并将结果存储到指定的变量中。
  • JOIN: 将列表中的元素使用指定的分隔符连接成一个字符串,并将结果存储到指定的变量中。

9、aux_source_directory 

用于将指定目录下的所有源文件自动添加到一个变量中。基本语法:

aux_source_directory(dir variable)

如把当前目录下所有源文件添加到一个变量中:

aux_source_directory(. SOURCES)

10、file

命令用于执行各种文件系统操作,包括创建、复制、删除文件或目录,检查文件或目录的属性等。file(GLOB ...)是CMake中用于查找文件的命令。它可以根据指定的模式匹配文件,并将匹配到的文件列表存储到变量中。如果有一个目录包含源文件,并且你想把所有的.cpp文件添加到一个变量中,示例如下:

file(GLOB SOURCES "src/*.cpp")

11、source_group

用于将CMake项目中的文件组织到特定的组(也称为“文件夹”或“分组”),可以讲文件显示到不同的分组。如想将源文件显示到source目录下,头文件显示到include目录下,示例如下:

aux_source_directory(. SOURCES)
source_group("source" FILES ${SOURCES}) 

file(GLOB INCLUDE "./*.h")
source_group("include" FILES ${INCLUDE})

12、add_executable

用于创建可执行文件的命令。

示例:

# 定义源文件
set(SOURCES main.cpp hello.cpp)

# 创建可执行文件
add_executable(hello_world ${SOURCES})

13、add_library

用于创建库的命令。通过这个命令,你可以定义静态库(.lib.a)或动态库(.dll.so)的目标。基本语法:

add_library(<target_name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            source1 [source2 ...])
  • <target_name>:库的名称。
  • [STATIC | SHARED | MODULE]:可选项,指定库的类型,分别为静态库、动态库和模块库。默认为静态库。
  • [EXCLUDE_FROM_ALL]:可选项,指定是否将该库排除在 make all 或 build 过程之外。这在构建过程中的选择性构建中很有用。
  • source1 [source2 ...]:库的源文件列表

示例:

# 定义静态库
add_library(my_static_lib STATIC util.cpp)

# 定义动态库
add_library(my_shared_lib SHARED util.cpp)

 14、set_target_properties

用于设置目标属性的命令。基本语法:

set_target_properties(target1 target2 ...
                      PROPERTIES prop1 value1
                      prop2 value2 ...)
  • target1 target2 ...:目标的名称,可以是可执行文件、静态库、动态库等。
  • PROPERTIES:用于指定目标的属性。
  • prop1 value1 prop2 value2 ...:要设置的属性及其对应的值。

 常见属性:

  • OUTPUT_NAME:指定生成的可执行文件或库的名称。
  • RUNTIME_OUTPUT_DIRECTORY:指定可执行文件的输出目录。
  • LIBRARY_OUTPUT_DIRECTORY:指定库文件的输出目录。
  • ARCHIVE_OUTPUT_DIRECTORY:指定静态库文件的输出目录。
  • CXX_STANDARD:指定 C++ 标准(如 CXX_STANDARD 11CXX_STANDARD 14 等)。
  • COMPILE_OPTIONS:指定编译选项。
  • INCLUDE_DIRECTORIES:指定包含目录。
  • LINK_LIBRARIES:指定链接的库。

示例:

# 设置可执行文件的输出名称和路径
set_target_properties(my_executable PROPERTIES
                      OUTPUT_NAME "my_app"
                      RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

 15、target_link_libraries

用于为目标(如可执行文件、静态库、动态库)设置链接依赖的命令。它的主要作用是将目标与其他库或目标进行链接,以便在构建过程中正确地解析符号并生成最终的可执行文件或库。

示例:

# 创建一个可执行文件
add_executable(my_executable main.cpp)

# 链接一个名为 "my_library" 的库到可执行文件
target_link_libraries(my_executable my_library)

target_link_libraries 还支持一些选项来控制链接的行为和作用域:

  • PUBLIC:链接库时,PUBLIC 选项会将链接信息传递给依赖当前目标的其他目标。
  • PRIVATEPRIVATE 选项表示链接信息仅在当前目标中使用,不会传递给依赖当前目标的其他目标。
  • INTERFACEINTERFACE 选项表示目标不会链接这些库,但是会将链接信息传递给依赖当前目标的其他目标。

示例:

# 创建一个可执行文件
add_executable(my_executable main.cpp)

# 链接一个名为 "my_library" 的库,并将链接信息传递给依赖当前目标的其他目标
target_link_libraries(my_executable PUBLIC my_library)

 

在构建 CMake 项目时会遇到类似于 debugoptimized 的调试和优化相关的选项,这些选项通常与 CMake 的变量和属性一起使用。

一种常见的做法是使用 CMake 中的 CMAKE_BUILD_TYPE 变量来指定构建类型(例如 Debug、Release 或者其他自定义的类型)。然后,在根据构建类型来指定相应的链接选项。

示例:

# 设置构建类型,默认为 Release
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

# 创建一个可执行文件
add_executable(my_executable main.cpp)

# 根据构建类型设置不同的链接选项
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    target_link_libraries(my_executable debug my_debug_library)
else()
    target_link_libraries(my_executable optimized my_release_library)
endif()

我自己写了一点练练手。

创建总的工程目录cmake示例:

cmake_minimum_required(VERSION 1.0.0)
project(MyProject VERSION "1.0.0")


## set path
set(FW_INCLUDE_PATH "${PROJECT_SOURCE_DIR}/framework/include")
set(FW_SOURCE_PATH "${PROJECT_SOURCE_DIR}/framework/source")

## code file
option(BUILD_FRAMEWORK_FLAG "BUILD_FRAMEWORK_FLAG" ON)
if(BUILD_FRAMEWORK_FLAG)
add_subdirectory(framework)
endif(BUILD_FRAMEWORK_FLAG)

子目录cmakelists示例:

set(TARGET "component")
set(OUT_PUT_NAME "libComponent")

include_directories("${FW_INCLUDE_PATH}")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")

aux_source_directory(. SOURCES)
source_group("source" FILES ${SOURCES}) 

file(GLOB PUBLICS "${FW_INCLUDE_PATH}/component/*.h")
source_group("public" FILES ${PUBLICS})

file(GLOB INCLUDE "./*.h")
source_group("include" FILES ${INCLUDE})

set(ALL_SOURCES 
${SOURCES}
${PUBLICS}
${INCLUDE}
"CmakeLists.txt")

add_library(${TARGET} SHARED ${ALL_SOURCES})

set_target_properties(${TARGET} PROPERTIES OUTPUT_NAME ${OUT_PUT_NAME})
set_target_properties(${TARGET} PROPERTIES FOLDER "component")

  • 45
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值