1. CMake常见的变量
在 CMake 中,有许多常见的变量可用于配置和管理构建过程。以下是一些常见的变量,包括当前源码路径:
CMAKE_SOURCE_DIR:当前 CMakeLists.txt 所在的源码目录的根路径。
CMAKE_BINARY_DIR:构建目录的根路径,即构建生成的可执行文件、库和其他构建输出的存放位置。
CMAKE_CURRENT_SOURCE_DIR:当前处理的 CMakeLists.txt 所在的源码目录的路径。
CMAKE_CURRENT_BINARY_DIR:当前处理的 CMakeLists.txt 所在的构建目录的路径。
CMAKE_CURRENT_LIST_DIR:当前处理的 CMakeLists.txt 所在的路径(源码目录或构建目录)。
CMAKE_CURRENT_LIST_LINE:当前正在处理的 CMakeLists.txt 的行号。
CMAKE_MODULE_PATH:一个用于指定额外的 CMake 模块(.cmake 文件)的搜索路径的列表。
CMAKE_INCLUDE_CURRENT_DIR:如果设置为 ON,则在构建过程中自动将当前处理的 CMakeLists.txt 所在的目录添加到包含路径中。
CMAKE_LIBRARY_OUTPUT_DIRECTORY:库文件的输出目录。
CMAKE_RUNTIME_OUTPUT_DIRECTORY:可执行文件的输出目录。
2. 宏
(1).cmake_minimum_required(VERSION 3.17)
:设置cmake的最小版本
(2).project("Gtest")
:设置工程名称
(3).include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../../../include/ )
:可以使用 include_directories 命令来指定自定义的头文件路径。该命令会将指定的路径添加到编译器的头文件搜索路径中。
(4).file(GLOB sources ${CMAKE_CURRENT_SOURCE_DIR}/../../../../src/*.cpp )
:file GLOB命令主要用于匹配规则在指定的目录内匹配到所需要的文件,命令行格式:
file(GLOB <variable> [LIST_DIRECTORIES true[false]] [RELATIVE <path> ] [CONFIGURE_DEPENDS] [<globbing-expression> ...])
LIST_DIRECTORIES true[false]: 如果为false,目录将会被省略,默认情况下返回是带目录
RELATIVE
CONFIGURE_DEPENDS:如果该标记位设置,在主构建系统检查目标添加逻辑,必便在构建时重新运行标记的GLOB命令
globbing-expression:匹配表达式,表达式类似与正则匹配,如下:
*.cxx - match all files with extension cxx
*.vt? - match all files with extension vta,...,vtz
f[3-5].txt - match files f3.txt, f4.txt, f5.txt
(5).find_package(OpenCV REQUIRED)
:命令可以用于查找和加载外部库,以上命令会在系统中查找安装的OpenCV 库
(6).add_executable(MyExecutable main.cpp)
:添加可执行文件
(7).target_link_libraries(MyExecutable PUBLIC ${OpenCV_LIBS})
:将OpenCV库链接到我们的可执行文件MyExecutable中
(8).add_difinitions()
:用于向编译器添加预定义的宏定义,通过使用add_definitions命令,您可以在构建过程中定义一些全局的宏,这些宏将在所有源文件中可见。例子:
# 添加宏定义
add_definitions(-DMY_MACRO)
在上述示例中,通过add_definitions(-DMY_MACRO)命令,我们定义了一个名为MY_MACRO的宏。通过在源代码中使用#ifdef和#ifndef等条件预处理指令,您可以根据宏的定义情况来选择不同的代码路径。例如:
#ifdef MY_MACRO
// 如果MY_MACRO已定义,则执行此处的代码
// ...
#else
// 如果MY_MACRO未定义,则执行此处的代码
// ...
#endif
(9).set_target_properties
:用于设置目标(例如可执行文件、库等)的属性。通过使用set_target_properties命令,您可以定制化目标的属性, 如设置输出目录、编译选项、链接选项等。
以下是一个使用set_target_properties命令的示例:
cmake_minimum_required(VERSION 3.0)
project(MyProject)
# 添加可执行文件
add_executable(my_executable main.cpp)
# 设置目标属性
set_target_properties(my_executable PROPERTIES
OUTPUT_NAME "my_executable" # 设置输出文件名为my_executable
RUNTIME_OUTPUT_DIRECTORY "bin" # 设置输出目录为bin
CXX_STANDARD 17 # 设置使用C++标准为C++17
COMPILE_FLAGS "-Wall" # 设置编译选项,开启所有的警告信息
LINK_FLAGS "-L/usr/local/lib" # 设置链接选项,指定额外的库搜索路径
)
# 链接第三方库
target_link_libraries(my_executable my_library)
在上述示例中,通过set_target_properties命令,我们设置了my_executable这个目标的属性。例如,我们设置了输出文件名为my_executable,输出目录为bin,在编译时开启了所有的警告信息,并指定了额外的库搜索路径。您可以根据需要设置目标的各种属性,以满足项目的要求.
(10)aux_source_directory
aux_source_directory函数用于将指定目录下的源代码文件自动添加到一个变量中。这个函数可以简化在CMakeLists.txt中列举每个源文件的过程.
# 将指定目录下的源文件添加到变量SOURCES中
aux_source_directory(src SOURCES)
# 添加可执行文件,并将SOURCES变量传递给它
add_executable(myexe ${SOURCES})