我在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。这是预期的还是有更好的方法来定义它?
答案 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链接器是单通道链接器。