跳转至

CMake

CMake本质上可简单理解为一个Makefile生成器,有自己的构建语法。

简单案例

普通构建配置

假设有以下项目结构:

.
├── build       # use for store cmake cache
├── CMakeLists.txt
├── include     # store .h file   ├── point.h
│   └── vector.h
├── logger      # logger program   ├── log.cpp
│   └── log.h
├── main.cpp    # main program
├── src         # executable file   ├── point.cpp
│   ├── template.py
│   └── vector.cpp
├── test        # test file   └── test.cpp
├── vcpkg-configuration.json
└── vcpkg.json

CMakeLists.txt如下

# 指定 CMake 的最低版本要求
cmake_minimum_required(VERSION 3.10)

# 设置项目名称与版本号
project(cgEngine VERSION 0.0.0)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 添加可执行文件
# 创建静态库
add_library(${PROJECT_NAME}_lib STATIC
    src/vector.cpp
    src/point.cpp
    logger/log.cpp
)

# 主可执行文件
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_lib)

# 设置头文件目录
# 设置头文件目录(PUBLIC可见性)
target_include_directories(${PROJECT_NAME}_lib
    PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_SOURCE_DIR}/logger)

# 添加测试目标
enable_testing()  # 启用测试功能

# 添加测试可执行文件
# 创建测试可执行文件并链接库
add_executable(test_${PROJECT_NAME} test/test.cpp)
# 主可执行文件需要包含目录
target_include_directories(${PROJECT_NAME}
    PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(test_${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_lib)

# 添加测试并指定工作目录
add_test(NAME test_${PROJECT_NAME}
    COMMAND test_${PROJECT_NAME}
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR})

target_link_libraries(${PROJECT_NAME}_lib PRIVATE GL glfw m)

target_link_libraries(test_${PROJECT_NAME} PRIVATE GL glfw m)

可通过以下命令进行测试构建/构建:

cd build
cmake ..
make

通过以下命令进行测试/运行主程序:

# test
make test

# main program
./cgEngine

通过以下命令清除构建缓存:

# in build/
rm -rf *

配合vcpkg进行构建

基础配置参考vcpkg | virtualguard's note

假设需要依赖glfw3CMakeLists.txt如下

# 指定 CMake 的最低版本要求
cmake_minimum_required(VERSION 3.10)

# 设置项目名称与版本号
project(cgEngine VERSION 0.0.0)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 添加可执行文件
# 创建静态库
add_library(${PROJECT_NAME}_lib STATIC
    src/vector.cpp
    src/point.cpp
    logger/log.cpp
)

# 主可执行文件
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_lib)

# 设置头文件目录
# 设置头文件目录(PUBLIC可见性)
target_include_directories(${PROJECT_NAME}_lib
    PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_SOURCE_DIR}/logger)

# 添加测试目标
enable_testing()  # 启用测试功能

# 添加测试可执行文件
# 创建测试可执行文件并链接库
add_executable(test_${PROJECT_NAME} test/test.cpp)
# 主可执行文件需要包含目录
target_include_directories(${PROJECT_NAME}
    PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(test_${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_lib)

# 添加测试并指定工作目录
add_test(NAME test_${PROJECT_NAME}
    COMMAND test_${PROJECT_NAME}
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR})

# 设置链接库
target_link_libraries(${PROJECT_NAME}_lib PRIVATE 
    m
    GL 
    glfw 
)

target_link_libraries(test_${PROJECT_NAME} PRIVATE 
    m
    GL 
    glfw 
)