从C ++引用静态库中的C函数
我有一个用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 ++中,我很生气。 我确信我只是在做一些愚蠢的事情。 我希望我的简单示例代码能很好地说明问题。
在此先感谢您的帮助!
另一个解决方案(对Yann最初建议的解决方案)是用你的“C”标题包围:
#ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif
这使您无需记住:
extern "C" { #include "foo.h" }
你使用foo.h
每个地方
一定要使用:
extern "C" { #include "myHeader.h" }
否则C ++编译器将生成名称受损的符号名称。