【发布时间】:2011-12-18 14:57:59
【问题描述】:
我在使用 CMockery 模拟时遇到问题,即出现重复符号警告。
代码的实现比较长,so it's in a Gist here。
Gist 包括测试 (.c)、实现 (.c) 和头文件,项目使用 CMake 构建并使用 CTest 进行测试,使用 CMockery。
实际错误是:
ld: duplicate symbol _wit_configuration_file_path in ../libwatchedit.a(configuration.c.o) and CMakeFiles/libwatcheditTest.dir/configuration_test.c.o for architecture x86_64
我能想出的解决方法是将char *wit_configuration_file_path() 声明为static。由于实现与int wit_load_configuration(wit_configuration config) 的实现在同一个文件中,我预计这会起作用,它实际上可以干净地编译和链接。不幸的是,并且可能作为将wit_configuration_file_path() 声明为静态的副作用,它从不使用模拟。
google examples for cmockery 太做作了,没有解释应该如何处理。
将函数声明为 not as 也可能更智能、更容易测试:
int wit_load_configuration(wit_configuration config);
而是:
int wit_load_configuration(char* filepath, wit_configuration, config);
在这种情况下,我不需要模拟或存根任何东西;但我相信问题会再次困扰我,因为我预计将来我需要模拟一些东西(否则怎么可能编写全面的单元测试?)
1:我应该如何正确地做到这一点,static 表示它从不使用我的模拟,在没有static 的情况下声明它会导致重复符号错误。
2:我应该更改 API 的设计吗?它适用于这种情况,但我想知道如何正确模拟函数。
3:将我的测试与我的整个库链接起来是不是一个错误,我正在使用 CMake,以及 my test's CMakeLists.txt 中的 target_link_libraries(libwatcheditTest watchedit) 行。
【问题讨论】:
标签: c linker cmake working-set cmockery