使用CMake构建含FFF的GoogleTest可执行文件时遇未定义引用错误
问题原因及解决方案
错误原因
链接器报错undefined reference to 'fff',核心原因是FFF框架的核心全局对象fff没有被编译进测试可执行文件。FFF是头文件驱动的假函数框架,它的实现代码(包括fff结构体实例)需要通过定义FFF_IMPLEMENTATION宏来触发生成,而你的代码中未完成这一步。
修复方法
两种可靠修复方式二选一即可:
方式一:在测试源文件中直接定义实现宏
修改module_tests.cpp,在包含fff.h前添加FFF_IMPLEMENTATION宏定义:
#include <gtest/gtest.h> extern "C" { #define FFF_IMPLEMENTATION // 必须在包含fff.h前定义此宏 #include "fff.h" FAKE_VALUE_FUNC(uint16_t, MODULEA_getSampleValue); } extern "C" { #include "module_b.h" } // Tests written here
方式二:通过CMake全局配置实现宏
在CMakeLists.txt中给测试目标添加编译定义,确保FFF的实现代码被生成:
add_executable(module_test src/module_tests.cpp ) # 添加此行,给测试目标定义FFF_IMPLEMENTATION宏 target_compile_definitions(module_test PRIVATE FFF_IMPLEMENTATION) target_link_libraries(module_test PRIVATE gtest_main MODULE_A MODULE_B ) target_include_directories(module_test PUBLIC ../inc ) include(GoogleTest) gtest_discover_tests(module_test)
注意:无论用哪种方式,
FFF_IMPLEMENTATION只能被定义一次(要么在单个源文件中,要么通过CMake全局定义但仅在一个源文件中包含fff.h),否则会触发多重定义的链接错误。
内容的提问来源于stack exchange,提问作者upsidedownone
相关产品推荐
相关产品推荐

