如何在多文件中正确引入FFF模拟函数,避免链接错误?
解决FFF假函数多文件链接冲突问题
问题本质
FFF生成的假函数默认会在头文件中直接生成函数定义,而非仅做声明。当多个测试源文件都包含这个头文件时,每个文件都会编译出一份假函数的定义,链接阶段就会触发multiple definition错误——因为链接器发现同一个函数被定义了多次。
正确的拆分方案:声明与定义分离
要让假函数在多个测试文件中都能访问,同时避免重复定义,必须把假函数的声明和定义拆分开:
- 头文件只放声明(比如命名为
fake_targets.h):
// fake_targets.h #ifndef FAKE_TARGETS_H #define FAKE_TARGETS_H // 用头文件防护避免重复包含 #include "fff.h" // 用extern标记假函数的声明,告诉编译器这些函数在其他地方定义 extern FAKE_VOID_FUNC(foo, int); extern FAKE_VALUE_FUNC(int, bar, const char*); #endif
- 单独的源文件放定义(比如
fake_targets.c):
// fake_targets.c #include "fake_targets.h" // 直接定义假函数,这里不需要extern FAKE_VOID_FUNC(foo, int); FAKE_VALUE_FUNC(int, bar, const char*);
测试文件的使用方式
所有测试源文件只需要包含头文件fake_targets.h就能使用假函数:
// test_a.c #include "fake_targets.h" #include "unity.h" void test_foo_called(void) { foo(100); TEST_ASSERT_EQUAL(1, foo_fake.call_count); } // test_b.c #include "fake_targets.h" #include "unity.h" void test_bar_returns_correctly(void) { bar_fake.return_val = 42; int result = bar("test"); TEST_ASSERT_EQUAL(42, result); }
编译链接要点
编译测试代码时,必须把fake_targets.c和所有测试源文件一起编译链接。这样整个测试工程里只会有一份假函数的定义,所有测试文件都能通过头文件的声明访问到这些假函数,不会再出现链接冲突。
如果用构建工具(比如CMake),记得把fake_targets.c添加到测试目标的源文件列表里。
内容的提问来源于stack exchange,提问作者Martel
相关产品推荐
相关产品推荐

