在库中包括带有外部C链接的函数

| 我在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链接器默认情况下是单程链接器。     

要回复问题请先登录注册