如何通过CMake正确构建基于cmocka的C语言单元测试
解决CMake链接cmocka构建单元测试的方案
1. 参考项目结构
先明确典型的项目目录结构,方便对应配置:
. ├── src │ ├── main.c │ └── apple.c # 被测试的业务代码文件 ├── tests │ └── test_apple.c # cmocka单元测试代码 └── CMakeLists.txt
2. 修改后的CMakeLists.txt配置
# 指定最低CMake版本要求 cmake_minimum_required(VERSION 3.10) # 定义项目名称与使用的编程语言 project(apples_project C) # 设置C语言标准并强制启用 set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) # 构建主程序可执行文件 add_executable(apples src/main.c src/apple.c) # 通过pkg-config查找cmocka库的依赖信息 find_package(PkgConfig REQUIRED) pkg_check_modules(CMOCKA REQUIRED cmocka) # 构建单元测试可执行文件 add_executable(test_apple tests/test_apple.c src/apple.c) # 为测试目标配置cmocka的链接与编译参数 target_link_libraries(test_apple PRIVATE ${CMOCKA_LIBRARIES}) target_include_directories(test_apple PRIVATE ${CMOCKA_INCLUDE_DIRS}) target_compile_options(test_apple PRIVATE ${CMOCKA_CFLAGS_OTHER}) # 注册测试(可选,支持用ctest批量运行测试) enable_testing() add_test(NAME apple_unit_tests COMMAND test_apple)
3. 关键配置说明
- cmocka依赖查找:使用
pkg_check_modules可以自动读取cmocka的.pc配置文件,无需手动硬编码头文件路径、链接库路径等信息,适配不同系统的安装环境。 - 测试目标依赖:单元测试需要依赖业务代码(如
src/apple.c)和cmocka库,所以构建测试可执行文件时要包含业务源文件,再通过target_link_libraries关联cmocka库。 - 编译参数传递:
CMOCKA_CFLAGS_OTHER会包含cmocka要求的编译参数(如-fPIC、警告选项),确保编译过程兼容。
4. 验证操作步骤
- 进入build目录:
cd build - 重新生成构建文件:
cmake .. - 编译所有目标:
make - 运行测试:直接执行
./test_apple,或用ctest批量运行注册的测试
如果你的业务代码是编译为库而非直接引用源文件,可调整为如下配置:
# 将业务代码编译为静态库 add_library(apple_core STATIC src/apple.c) # 主程序链接业务库 target_link_libraries(apples PRIVATE apple_core) # 测试程序链接业务库与cmocka target_link_libraries(test_apple PRIVATE apple_core ${CMOCKA_LIBRARIES})
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

