前言
在完成了全面的单元测试之后,构建系统的可靠性和自动化流程变得至关重要。本文将深入介绍位于 code/backend/dll/ 和 code/backend/gtester/ 目录下的CMake构建配置,以及如何构建高效的持续集成流程,确保代码质量和部署的可靠性。
CMake构建系统架构
为什么选择CMake?
CMake作为跨平台构建系统,在现代C++项目中具有以下优势:
- 跨平台兼容: 支持Windows、Linux、macOS多平台编译
- IDE集成: 良好的Visual Studio、VS Code、CLion支持
- 模块化管理: 清晰的源文件组织和目标管理
- 依赖处理: 自动化的库依赖和链接管理
- 扩展性强: 丰富的内置函数和自定义命令支持
后端DLL构建配置
从 code/backend/dll/CMakeLists.txt 来看,我们的DLL项目采用了高度模块化的构建配置:
cmake_minimum_required(VERSION 3.10)
project (libBackend)
# 环境变量配置
SET(UNISDK_ROOT_PROJ "$ENV{UNISDK_ROOT}")
# 头文件搜索路径
include_directories(./Src)
include_directories(${UNISDK_ROOT_PROJ}/export_csdk/)
include_directories(${UNISDK_ROOT_PROJ}/export_cppsdk/)
include_directories(${UNISDK_ROOT_PROJ}/export_cppsdk/cppsdk/third/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../submod_include)
模块化源文件组织
CMake使用 file(GLOB) 指令按业务模块组织源文件:
# 按功能模块分组管理源文件
file(GLOB IMPL_BOOKMANAGER_GROUP_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/Src/Impl/BookManager/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Src/Impl/BookManager/*.h"
)
file(GLOB IMPL_BOOKMANAGER_ADDBOOK_GROUP_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/Src/Impl/BookManager/AddBook/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Src/Impl/BookManager/AddBook/*.h"
)
file(GLOB IMPL_LOANMANAGER_GROUP_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/Src/Impl/LoanManager/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Src/Impl/LoanManager/*.h"
)
组织策略特点:
- 功能内聚: 每个模块的源文件独立管理
- 层次清晰: 主功能和子功能分层组织
- 维护便利: 新增模块时只需添加对应的GLOB配置
构建目标配置
# 编译预处理定义
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
# 库搜索路径
link_directories(${UNISDK_ROOT_PROJ}/export_csdk)
link_directories(${UNISDK_ROOT_PROJ}/export_cppsdk/cppsdk/third/Poco/lib)
# 创建共享库目标
add_library(${PROJECT_NAME} SHARED
${SRC_CPP_FILES} ${INC_H_FILES})
# DLL导出宏定义
target_compile_definitions(${PROJECT_NAME} PRIVATE LIB_BACKEND_EXPORTS)
# 链接外部库
target_link_libraries(${PROJECT_NAME}
cjson
PocoDatad
PocoFoundationd
)
自动化部署命令
CMake的 add_custom_command 提供了强大的自动化能力:
# 构建前的头文件导出
add_custom_command(TARGET ${PROJECT_NAME}
PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_SOURCE_DIR}/../submod_include/${PROJECT_NAME}
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/../submod_include/${PROJECT_NAME}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/Src/ModExport ${CMAKE_CURRENT_SOURCE_DIR}/../submod_include/${PROJECT_NAME}
)
# 构建后的库文件部署
add_custom_command(TARGET ${PROJECT_NAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/../submod_lib
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Debug/${PROJECT_NAME}.dll ${CMAKE_CURRENT_SOURCE_DIR}/../submod_lib
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Debug/${PROJECT_NAME}.lib ${CMAKE_CURRENT_SOURCE_DIR}/../submod_lib
)
测试项目构建配置
code/backend/gtester/CMakeLists.txt 展现了专业的测试项目构建实践:
Unicode和字符编码配置
# Windows平台Unicode配置
if(MSVC)
add_definitions(-DUNICODE -D_UNICODE)
add_compile_options(/utf-8)
endif()
# 非MSVC编译器配置
if(NOT MSVC)
add_definitions(-DUNICODE -D_UNICODE)
add_compile_options(-finput-charset=UTF-8 -fexec-charset=UTF-8)
endif()
# 异常处理配置
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHa")
测试框架集成
# 测试模块源文件组织
file(GLOB TESTFRAMEWORK_BOOKMANAGER_GROUP_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/Src/TestFramework/BookManager/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Src/TestFramework/BookManager/*.h"
)
# 链接库配置
link_directories(${UNISDK_ROOT_PROJ}/export_cppsdk/cppsdk/third/googletest/lib/)
# 测试可执行文件目标
add_executable(${PROJECT_NAME} ${SRC_CPP_FILES} ${INC_H_FILES} depends_mod)
# 链接Google Test和业务库
target_link_libraries(${PROJECT_NAME} PRIVATE
gtest
gtest_main
libBackend
)
Visual Studio调试配置
# 设置调试参数
set_target_properties(${PROJECT_NAME} PROPERTIES
VS_DEBUGGER_COMMAND_ARGUMENTS "--gtest_filter=\"EditReaderPartialUpdateTest.*\""
)
# 设置启动项目
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${PROJECT_NAME})
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
构建系统最佳实践
1. 模块化构建策略
分层构建管理:
# 核心业务模块
add_subdirectory(BookManager)
add_subdirectory(ReaderManager)
add_subdirectory(LoanManager)

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



