指定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_DIR
和 CMAKE_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_libraries
和 target_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])