我希望能够使用
Cmockery来模拟我正在测试的C代码调用的C函数.作为迈出的一步,我将Cmockery示例
run_tests.c重命名为run_tests.cpp,并尝试编译并将其与cmockery.c链接:
g++ -m32 -DHAVE_CONFIG_H -DPIC -I ../cmockery-0.1.2 -I /usr/include/malloc -c run_tests.cpp -o obj/run_tests.o gcc -m32 -DHAVE_CONFIG_H -DPIC -Wno-format -I ../cmockery-0.1.2 -I /usr/include/malloc -c ../cmockery-0.1.2/cmockery.c -o obj/cmockery.o g++ -m32 -o run_tests obj/run_tests.o obj/cmockery.o
前两个命令行(编译)是成功的,但在最后一次之后我得到:
Undefined symbols: "_run_tests(UnitTest const*,unsigned long)",referenced from: _main in run_tests.o ld: symbol(s) not found collect2: ld returned 1 exit status
该未定义的符号来自run_tests.cpp的第29行:
return run_tests(tests);
run_tests()函数在cmockery.c中定义.
阅读“Linking C++ code with ‘gcc’ (without g++)”后,我试过:
gcc -lstdc++ -m32 -o run_tests obj/run_tests.o obj/cmockery.o
但得到了相同的结果:
Undefined symbols: "_run_tests(UnitTest const*,referenced from: _main in run_tests.o ld: symbol(s) not found collect2: ld returned 1 exit status
解决方法
我认为你可以通过在cmockery.h文件的内容周围添加以下内容来使thinkgs从C链接:
在开头或附近:
#if defined(__cplusplus) extern "C" { #endif
在结尾处或附近:
#if defined(__cplusplus) } #endif
这样,在C源代码中使用头文件将忽略声明的extern“C”部分,但是当头部包含在C版本中时,编译器将被正确地告知该头部中的声明的链接使用C语义.
extern "C" { #include "cmockery.h" }
但我的偏好是将extern“C”块放在标题中(并且只在需要的东西周围 – 这可能需要一些分析).