C / C ++:在我的库中使用extern的正确位置?

时间:2011-03-29 07:02:40

标签: c compiler-construction linker extern

我正在创建一个共享库,并且在构建链接时(以及与测试程序的链接),它的功能仍未定义,现在我已经学习了名称修改以及为什么会导致类似这样的内容。

我假设在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

2 个答案:

答案 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)。