我正在创建一个共享库,并且在构建链接时(以及与测试程序的链接),它的功能仍未定义,现在我已经学习了名称修改以及为什么会导致类似这样的内容。
我假设在libfoo.h头文件中我会把:
#ifdef __cplusplus
extern "C" {
#endif
int foobar();
#ifdef __cplusplus
}
#endif
原型的externs是我需要应用它们的全部,还是我需要将它们包装在libfoo.c中的函数声明中,以便我的C ++程序可以读取它们?
以下评论更新:
链接错误是这样的:
g++ prototypes.cxx -L/usr/lib/ -lfoo
/tmp/ccKQmen4.o: In function `main':
prototypes.cxx:(.text+0x19): undefined reference to `foobar()'
collect2: ld returned 1 exit status
答案 0 :(得分:0)
只要使用C编译器编译它,就不必对源做任何事情。
这就是你在标题中告诉C ++编译器的内容 - 使用C调用和命名约定。
答案 1 :(得分:0)
C ++ FAQ有一整节用于混合C和C ++ http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.4
基本上唯一放置extern "C"
的地方是C和C ++中包含的头文件。如果您无法控制这些,请按照上一个答案(32.3)。