从C ++引用静态库中的C函数

时间:2011-03-13 20:53:29

标签: c++ c static-libraries

我有一个用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 ++中,我很生气。我确信我只是在做一些愚蠢的事情。我希望我的简单示例代码可以很好地说明问题。

提前感谢您的帮助!

2 个答案:

答案 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 ++编译器将生成名称受损的符号名称。