【问题标题】:Referencing C functions in static library from C++从 C++ 引用静态库中的 C 函数
【发布时间】:2011-03-13 20:53:28
【问题描述】:

我有一个用 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++ 生疏了。我确定我只是在做一些愚蠢的事情。我希望我的简单示例代码能够很好地说明问题。

提前感谢您的帮助!

【问题讨论】:

  • 不能说C++,但在C 中,你可能想让你的函数声明正确的原型......只需为参数指定voidvoid function1(void);跨度>
  • @pmg - 我认为自 1989 年以来就不再是“必需的”了!
  • @awoodland:在当前的C99中void function1();是一个声明; void function2(void); 是一个原型。根据它的实现方式,您可以将 function1 称为 function1();function1(foobar) 或 ...; function2 必须被称为function2()并相应地实现。
  • @pmg - 有趣。显示我使用了多少 C!

标签: c++ c static-libraries


【解决方案1】:

另一种解决方案(Yann 最初建议的解决方案)是在“C”标题周围加上:

 #ifdef __cplusplus
 extern "C" {
 #endif

 #ifdef __cplusplus
 }
 #endif 

这让您不必记住要做:

 extern "C" {
 #include "foo.h"
 }

您使用的每个地方foo.h

【讨论】:

    【解决方案2】:

    请务必使用:

    extern "C" {
     #include "myHeader.h"
    }
    

    否则,C++ 编译器将生成名称混乱的符号名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多