① 设置源码路径自动加载并把头文件包含进工程
设置工程头文件和源码文件路径后, 让 CMake 自动加载,这样之后即使新增了头文件和源码也不用修改 CMakeList.txt
cmake_minimum_required(VERSION 3.20)
project("auto_add_src")
#设置头文件路径
include_directories("./inc")
#设置源码路径符号
aux_source_directory("." MAIN_SRC)
aux_source_directory("./src" SRC)
#设置编译目标所依赖的源码
add_executable(${PROJECT_NAME} ${MAIN_SRC} ${SRC})
这样之后在 ./src 目录和 ./inc 目录新增了文件后不用修改以上 CMakeList.txt, 可以直接构建工程编译通过
假如此时打开工程的话,会发现只有 .cpp 或者 .cc 等文件。假如工程需要包含头文件则需要以下配置:
file(GLOB INC "${INCLUDE_DIR}/*.h")
add_executable(${PROJECT_NAME} ${MAIN_SRC} ${SRC} ${INC})
// INC 可用其他变量名替代
② message 和 变量
这个主要是用来构建项目时调试使用,通过 message 定位问题。
cmake_minimum_required(VERSION 3.20)
project("auto_add_src")
#cmake 直接退出
message(FATAL_ERROR "FATAL_ERROR")
#cmake 继续, 但是不继续生成工程了
message(SEND_ERROR "SEND_ERROR")
#警告, 并打印位置行号
message(WARNING "WARNING")
#NOTIC 输出字符串
message(NOTIC "NOTIC")
# -- 前缀输出字符串
message(STATUS "STATUS")
cmake 设置变量给 C++
add_definitions(-D)
//add_definitions(-DSTATIC), 此时会给 源码文件传递一个 STATIC 的宏, 该宏默认为1
③ include 包含
类似于 C++中头文件包含,用 include 包含文件中的内容替代当前语句
include("test.cmake") // 假如没有找到 test.cmake 就报错退出, 类似于 message(FATAL_ERROR "FATAL_ERROR")
include("test.cmake" OPTIONAL RESULT_VARIABLE ret)
// OPTIONAL 设置当前包含为可选项,假如没有找到该文件不退出
// RESULT_VARIABLE ret 假如找到该文件,ret 为包含文件的绝对路径; 否则为 NOTFOUND. 可通过 message 打印 ret
include
④ 打印编译时的生成信息
类似于 visual studio 编译时的 output
//方式①:直接在 CMakeList.txt 中设置
set(CMAKE_VERBOSE_MAKEFILE ON)
//方式②:通过命令行 -v
cmake --build <build-path> -v
⑤ 设置输出路径
a. 归档文件输出路径,主要包含静态库和动态库的符号文件(.lib .a .so)
通常借助 CMAKE_CURRENT_LIST_DIR (CMakeList.txt的绝对路径)来设置
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY <path>) //这个只对 linux 或者 Mac 有效,设置的是 .so的路径
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY <path>) //.lib 或者 .a 的路径
b. 执行程序输出目录(.exe .dll)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY <path>) //.exe 或者 .dll 的路径
⑥ 使用 vcpkg 库构建工程
cmake -S . -B ./build -DCMAKE_TOOLCHAIN_FILE=<vcpkg-root>/scripts/buildsystems/vcpkg.cmake