问题描述
|
我在C ++代码中包含了一些带有外部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时,除非包含其他文件(Mod.cpp)中的Y.h并使用类测试,否则我看不到extern块下的函数。因此,除非我在Mod.cpp中创建测试类的对象,否则即使在libmod-O.a的构建过程中通过Y.cpp编译,也不会在libmod-O.a中看到外部函数(fnA,fnB)。这样做的结果是,当另一个模块使用fnA,fnB时发生链接器错误。
我看不到外部函数fnA和fnB之间的连接以及Mod.cpp中类测试的用法。这是预期的还是有更好的方法来定义这一点?
解决方法
您的意思当然是外部\“ 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.
, 您可能会有一个链接顺序问题,其中使用fnA的文件位于libMod-O.a的链接之后,而具有对象测试的Mod.cpp位于libMod-O.a的前面,因此obj文件在以后需要fnA / fnB之前被拉入。 gnu链接器默认情况下是单程链接器。