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

Rya*_*yan 4 c c++ static-libraries

我有一个用C编写的静态函数库.假设头文件名为myHeader.h,看起来像:

#ifndef MYHEADER_H
#define MYHEADER_H

void function1();
void function2();

#endif
Run Code Online (Sandbox Code Playgroud)

function1和function2不是什么特别的东西.假设它们存在于名为impl1.c的文件中,如下所示:

#include "myHeader.h"

void function1() {
    // code
}
void function2() {
    // more code
}
Run Code Online (Sandbox Code Playgroud)

到目前为止提到的所有代码都被编译成一个名为libMyLib.a的静态库.我宁愿不修改用于构建此库的任何代码.我还有一个C++标头(cppHeader.h),它看起来像:

#ifndef CPPHEADER_H
#define CPPHEADER_H

class CppClass {
    private:
        double attr1;
    public:
        void function3();
};
#endif
Run Code Online (Sandbox Code Playgroud)

然后cppHeader.cpp看起来像:

#include "cppHeader.h"
#include "myHeader.h"

// constructor
CppClass::CppClass(){}

void CppClass::function3() {
    function1();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我得到一个关于对function1()的未定义引用的错误.我相信在编译时我已正确地链接了所有内容.在我的C++中,我很生气.我确信我只是在做一些愚蠢的事情.我希望我的简单示例代码能很好地说明问题.

在此先感谢您的帮助!

Fle*_*exo 6

另一个解决方案(对Yann最初提出的解决方案)是用你的"C"标题包围:

 #ifdef __cplusplus
 extern "C" {
 #endif

 #ifdef __cplusplus
 }
 #endif 
Run Code Online (Sandbox Code Playgroud)

这使您无需记住:

 extern "C" {
 #include "foo.h"
 }
Run Code Online (Sandbox Code Playgroud)

你使用的每个地方 foo.h