我希望能够使用 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
那个 undefined symbol 来自 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*, unsigned long)", referenced from:
_main in run_tests.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
如何编译和链接 C++ 代码以便它在 C 代码中找到符号?
最佳答案
我认为您可以通过在 cmockery.h 文件的内容周围添加以下内容来让 thinkgs 从 C++ 链接:
在开头或接近开头:
#if defined(__cplusplus)
extern "C" {
#endif
在或接近结束时:
#if defined(__cplusplus)
}
#endif
这样,在 C 源代码中使用 header 将忽略声明的 extern "C"
部分,但是当 header 包含在 C++ 构建中时,编译器将被正确告知该 header 中声明的链接使用 C 语义。
对于快速测试或者如果您不想修改 header ,您可以尝试:
extern "C" {
#include "cmockery.h"
}
但我的偏好是将 extern "C"
block 放在 header 中(并且仅围绕所需的内容 - 这可能需要一些分析)。
关于c++ - 如何编译 C++ 代码并将其与已编译的 C 代码链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4598308/