c++ - 如何编译 C++ 代码并将其与已编译的 C 代码链接?

标签 c++ c gcc undefined-symbol cmockery

我希望能够使用 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/

相关文章:

c++ - std::queue::size 的大 O() 顺序是什么?

c++ - 数论算法

c - 如何8字节对齐静态数组中的每个字符串?

gcc - 为什么 gcc -Og 不生成源代码行映射?

c++ - 我如何在 Red Hat 上强制使用 cxx11 ABI?

C++ main() 脑筋急转弯

c++ - 如何输入每个单词都在字符串数组中的句子,直到用户按下回车键

c - 如何并行 mmap 以加快文件读取速度?

c - 在 C 中存储格式化数据

linux - 如何确保在 Linux 中使用 -g 编译程序或共享库