我有一个用C编写的静态函数库。假设头文件名为myHeader.h,看起来像:
#ifndef MYHEADER_H
#define MYHEADER_H
void function1();
void function2();
#endif
function1和function2不是什么特别的东西。假设它们存在于名为impl1.c的文件中,如下所示:
#include "myHeader.h"
void function1() {
// code
}
void function2() {
// more code
}
到目前为止提到的所有代码都被编译成一个名为libMyLib.a的静态库。我宁愿不修改用于构建此库的任何代码。我还有一个C ++标题(cppHeader.h),它看起来像:
#ifndef CPPHEADER_H
#define CPPHEADER_H
class CppClass {
private:
double attr1;
public:
void function3();
};
#endif
然后cppHeader.cpp看起来像:
#include "cppHeader.h"
#include "myHeader.h"
// constructor
CppClass::CppClass(){}
void CppClass::function3() {
function1();
}
当我尝试编译它时,我得到一个关于对function1()的未定义引用的错误。我相信在编译时我已正确地链接了所有内容。在我的C ++中,我很生气。我确信我只是在做一些愚蠢的事情。我希望我的简单示例代码可以很好地说明问题。
提前感谢您的帮助!
答案 0 :(得分:6)
另一个解决方案(对Yann最初建议的解决方案)是用“C”标题包围:
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
这使您无需记住:
extern "C" {
#include "foo.h"
}
您使用的每个地方foo.h
答案 1 :(得分:4)
请务必使用:
extern "C" {
#include "myHeader.h"
}
否则C ++编译器将生成名称受损的符号名称。