You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多文件中正确引入FFF模拟函数,避免链接错误?

解决FFF假函数多文件链接冲突问题

问题本质

FFF生成的假函数默认会在头文件中直接生成函数定义,而非仅做声明。当多个测试源文件都包含这个头文件时,每个文件都会编译出一份假函数的定义,链接阶段就会触发multiple definition错误——因为链接器发现同一个函数被定义了多次。

正确的拆分方案:声明与定义分离

要让假函数在多个测试文件中都能访问,同时避免重复定义,必须把假函数的声明和定义拆分开:

  1. 头文件只放声明(比如命名为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
  1. 单独的源文件放定义(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:47:23