CMake学习记录

指定CMake版本

cmake_minimum_required(VERSION 3.15)

指定项目名称

project(test)

设置源文件变量

set(SRC add.cpp div.cpp mult.cpp main.cpp sub.cpp)

遍历指定目录下的源文件

aux_source_directory(${PROJECT_SOURCE_DIR} SRC)

使用file遍历源文件

file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR})

 GLOB 是一个文件操作命令,用于生成符合指定模式的文件列表。它的主要作用是简化文件的管理,使得你不需要手动列出每一个源文件或头文件。

使用示例:

/my_project
  /src
    main.cpp
    util.cpp
    helper.cpp
  /include
    myheader.h

 使用 GLOB 来自动收集 src 目录中的所有 .cpp 文件

# 设置源文件目录
set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)

# 使用 GLOB 收集所有 .cpp 文件
file(GLOB SRC_FILES ${SOURCE_DIR}/*.cpp)

# 添加可执行文件,使用收集到的源文件
add_executable(MyExecutable ${SRC_FILES})

GLOB 命令是在配置时执行的,而不是在构建时执行的。这意味着如果在配置后添加或删除了源文件,需要重新运行 CMake 配置命令以更新文件列表。 

设置可执行文件路径

set(EXECUTABLE_OUTPUT_PATH /home/xxx/aa/bb/cc)

设置cxx标准

set(CMAKE_CXX_STANDARD 11)

或者执行cmake时指定宏

cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11

生成可执行文件

add_executable(app ${SRC})

PROJECT_SOURCE_DIR和CMAKE_CURRENT_SOURCE_DIR有什么区别和联系

 在 CMake 中,PROJECT_SOURCE_DIRCMAKE_CURRENT_SOURCE_DIR 都是用于指代项目源文件目录的变量,但它们的具体用途和适用场景有所不同。下面是它们的区别和联系:

PROJECT_SOURCE_DIR

  • 含义PROJECT_SOURCE_DIR 指的是顶层 CMakeLists.txt 文件所在的目录,即整个项目的根目录。
  • 使用场景:当你需要引用整个项目的根目录时,使用这个变量。例如,在大型项目中可能包含多个子目录和子项目,如果你想引用项目根目录下的文件或目录,可以使用 PROJECT_SOURCE_DIR
  • 定义:这个变量是在调用 project() 命令时自动定义的。

CMAKE_CURRENT_SOURCE_DIR

  • 含义CMAKE_CURRENT_SOURCE_DIR 指的是当前处理的 CMakeLists.txt 文件所在的目录。CMake 在处理每一个 CMakeLists.txt 文件时都会设置这个变量。
  • 使用场景:当你需要引用当前 CMakeLists.txt 文件所在目录的文件或子目录时,使用这个变量。在多层目录结构中编写 CMakeLists.txt 时,特别有用。
  • 定义:这个变量是在处理每一个 CMakeLists.txt 文件时自动定义的。

联系

  • PROJECT_SOURCE_DIR 通常用于整个项目范围内的路径引用,而 CMAKE_CURRENT_SOURCE_DIR 则用于当前处理目录范围内的路径引用。
  • 两者都可以用于指定相对路径,但作用域不同。

示例

/my_project
  /src
    CMakeLists.txt
    main.cpp
  /include
    CMakeLists.txt
    myheader.h
  CMakeLists.txt

my_project/src/CMakeLists.txt 文件中:

  • PROJECT_SOURCE_DIR 指向 /my_project
  • CMAKE_CURRENT_SOURCE_DIR 指向 /my_project/src

my_project/include/CMakeLists.txt 文件中:

  • PROJECT_SOURCE_DIR 仍然指向 /my_project
  • CMAKE_CURRENT_SOURCE_DIR 指向 /my_project/include

指定头文件路径

include_directories(headpath)

生成静态库

cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
add_library(calc STATIC ${SRC_LIST}) 

生成动态库

cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
add_library(calc SHARED ${SRC_LIST}) 

设置库文件输出路径

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

指定库文件和路径

# 包含头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/lib) 
# 链接静态库
link_libraries(calc)

在 CMake 中,link_librariestarget_link_libraries 都用于指定要链接的库,但它们的作用范围和推荐使用方式有所不同。

link_libraries

  • 作用:设置全局或目录范围内的链接库。这意味着在调用这个命令之后定义的所有目标都会自动链接到这些库。
  • 使用场景:适用于较小的项目或简单的情况,在这种情况下,你希望所有目标都链接到相同的一组库。
  • 缺点:在大型项目中使用时可能会导致不必要的链接,增加了项目复杂性和潜在的错误风险。
  • 用法:通常在 CMakeLists.txt 文件的开始部分使用。
  • 示例
link_libraries(my_global_library)
add_executable(MyExecutable main.cpp)
add_executable(MyOtherExecutable other.cpp)
# Both MyExecutable and MyOtherExecutable will link to my_global_library

target_link_libraries

  • 作用:为特定目标(如可执行文件或库)指定链接库。它更灵活,更推荐使用。
  • 使用场景:适用于需要精确控制哪个目标链接到哪些库的情况。这在大型项目中尤其有用,因为你可以为每个目标单独设置所需的库。
  • 优点:避免了不必要的库链接,提高了项目的可维护性和清晰度。
  • 用法:在定义目标之后使用。
  • 示例
add_executable(MyExecutable main.cpp)
add_executable(MyOtherExecutable other.cpp)

target_link_libraries(MyExecutable my_library1 my_library2)
target_link_libraries(MyOtherExecutable my_library3)

联系与区别

  • 范围link_libraries 影响在其调用之后定义的所有目标,而 target_link_libraries 只影响特定的目标。
  • 灵活性target_link_libraries 提供了更高的灵活性,允许为每个目标单独指定链接库,这在大型项目中非常重要。
  • 推荐使用:通常推荐使用 target_link_libraries,因为它更清晰且更易于维护。

总结

  • link_libraries 用于全局或目录范围的库链接,适合简单项目。
  • target_link_libraries 用于特定目标的库链接,适合需要精确控制库链接的大型项目,推荐使用。

message日志

message([<mode>] "message text")

其中 <mode> 是可选的,可以是以下几种之一:

  • STATUS: 输出普通信息(默认模式)。
  • WARNING: 输出警告信息。
  • AUTHOR_WARNING: 输出作者警告信息。
  • SEND_ERROR: 输出错误信息,但不会中断配置过程。
  • FATAL_ERROR: 输出错误信息,并中断配置过程。

输出普通信息

默认模式下,message 命令输出普通信息。

message("This is a regular message.")

明确指定 STATUS 模式:

message(STATUS "This is a status message.")

输出警告信息

输出警告信息,配置过程继续进行。

message(WARNING "This is a warning message.")

输出作者警告信息

输出作者警告信息,通常用于指示代码中的潜在问题。

message(AUTHOR_WARNING "This is an author warning message.")

输出错误信息但不中断配置过程

使用 SEND_ERROR 模式输出错误信息,配置过程会继续进行,但最后会报告配置失败。

message(SEND_ERROR "This is an error message, but the configuration will continue.")

输出错误信息并中断配置过程

使用 FATAL_ERROR 模式输出错误信息,并立即中断配置过程。

message(FATAL_ERROR "This is a fatal error message. The configuration will stop.")

结合变量输出信息

你可以使用变量来动态生成输出信息。

set(MY_VAR "Hello, World!")
message(STATUS "The value of MY_VAR is: ${MY_VAR}")

 添加和删除字符串

set(变量名1 ${变量名1} ${变量名2} ...)
list(APPEND <list> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])

其他操作:

CMake 保姆级教程(上) | 爱编程的大丙 (subingwen.cn)

 添加宏定义

add_definitions(-D宏名称)

添加子目录

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

相关推荐

  1. CMake学习记录

    2024-06-09 10:14:04       10 阅读
  2. CMAKE学习

    2024-06-09 10:14:04       36 阅读
  3. 2401cmake,学习cmake1

    2024-06-09 10:14:04       39 阅读
  4. 2401cmake,学习cmake4

    2024-06-09 10:14:04       31 阅读
  5. CMake系列】00-CMake学习目录

    2024-06-09 10:14:04       10 阅读
  6. cmake学习笔记2

    2024-06-09 10:14:04       14 阅读
  7. Cmake学习笔记3

    2024-06-09 10:14:04       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 10:14:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 10:14:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 10:14:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 10:14:04       20 阅读

热门阅读

  1. TS的高级类型

    2024-06-09 10:14:04       8 阅读
  2. kafka是什么?

    2024-06-09 10:14:04       10 阅读
  3. Docker概念速通

    2024-06-09 10:14:04       7 阅读
  4. RuoyiAdmin项目搭建及Docker 部署备忘

    2024-06-09 10:14:04       13 阅读