智能图书馆管理系统开发实战系列(七):CMake构建系统与持续集成

前言

在完成了全面的单元测试之后,构建系统的可靠性和自动化流程变得至关重要。本文将深入介绍位于 code/backend/dll/code/backend/gtester/ 目录下的CMake构建配置,以及如何构建高效的持续集成流程,确保代码质量和部署的可靠性。

CMake构建系统架构

为什么选择CMake?

CMake作为跨平台构建系统,在现代C++项目中具有以下优势:

  1. 跨平台兼容: 支持Windows、Linux、macOS多平台编译
  2. IDE集成: 良好的Visual Studio、VS Code、CLion支持
  3. 模块化管理: 清晰的源文件组织和目标管理
  4. 依赖处理: 自动化的库依赖和链接管理
  5. 扩展性强: 丰富的内置函数和自定义命令支持

后端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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值