在库中包含具有extern C链接的函数

时间:2011-06-21 22:27:35

标签: c++ c linker-errors extern

我在c ++代码中包含了一些带有extern c链接的C函数。例如。

// File Y.cpp: 

extern C {  
 void fnA(void) { }  
 void fnB(void* a, void* b) { }  
}

class test {
....
};

// end of file

文件Y在模块Mod下。在为模块Mod构建库libMod-O.a时,我没有看到包含extern块的函数,除非Y.h包含在其他文件(Mod.cpp)中并且使用了类测试。因此,除非我在Mod.cpp中创建测试类的对象,否则我看不到libMod-O.a中的extern函数(fnA,fnB),即使通过Y.cpp在libMod-O.a的构建期间编译也是如此。结果是链接器错误发生,因为另一个模块使用fnA,fnB。

我没有看到包含extern函数fnA和fnB之间的连接以及在Mod.cpp中使用类test。这是预期的还是有更好的方法来定义它?

2 个答案:

答案 0 :(得分:2)

你的意思是外部的“C”。

您需要在C代码和C ++代码之间保持清晰的分离。

在YourCCode.h中:

#ifdef __cplusplus
extern "C" {
#endif

void fnA(void);
void fnB(void* a, void* b);

#ifdef __cplusplus
}
#endif

在YourCCode.c中:

void fnA(void) {}
void fnB(void* a, void* b) {}

确保您的编译器将YourCCode.c编译为C,而不是C ++。

在您的C ++代码中

#include "YourCCode.h"

fnA();
// etc.

答案 1 :(得分:1)

你可能有一个链接顺序问题,其中使用fnA的文件来自libMod-Oa的链接,但是带有对象测试的Mod.cpp出现在libMod-Oa之前,所以obj文件在需要fnA / fnB之前被拉入后来。默认情况下,gnu链接器是单通道链接器。