0

我正在尝试在我的程序中链接已经存在的库。我的程序是用 C++ 编写的,库是用 C 开发的。现在,我在编译和链接时遇到了这个问题。

我关注了这个论坛的许多帖子,这些帖子与将 gcc 库与 g++ 源链接有关。不知何故,我可以解决一些问题。现在,我面临一个问题。这是我的问题的详细信息。

在 testlib.h 文件中

int sum(int x, int y)

In testlib.c file

int sum(int x, int y) { 
    return x + y;
} 

我创建了这些文件的静态库。

我的下一步是在 g++ 源代码中使用这个函数。

在 call.hh 文件中,

#include<iostream>


#include "testlib.h"

using namespace std;

extern "C" {
    int sum(int x, int y);
}

namespace math_operation {
    void show_addition(int x, int y); 
}

我在 call.cc 文件中定义了这个函数

#include "call.hh"
#include<iostream>

using namespace std;

void math_operation::show_addition(int x, int y){
    cout<<" sum "<<sum(x, y)<<endl;
}

现在,我在 main.cc 中调用这个函数

#include "call.hh"

using namespace math_operation;
int main() {
    int x = 10;
    int y = 15;
    show_addition(x, y);
    return 0; 
}

我有两个问题:首先,它给出了编译错误,因为我已经两次声明了函数 int sum(int, int)。但是,如果我没有在 call.hh 中声明 extern "C" { int sum(int, int) },编译问题就解决了,并且链接器问题产生了以下错误:未定义对 `sum(int, int)' 的引用

我该如何解决?

4

2 回答 2

3
extern "C" {
#include "testlib.h"
}

并且不要自己声明。应该管用。

于 2013-01-07T07:18:33.310 回答
0

为了testlib.h在 C++ 文件中可用,它应该将函数声明为extern "C"

#ifdef __cplusplus
extern "C" {
#endif

int sum(int x, int y);

#ifdef __cplusplus
}
#endif

然后,当您定义sumextern "C"定义与声明匹配时,您不会收到重新声明错误或未定义的引用。

如果您无法编辑testlib.h,则可以将其包含在一个extern "C"块中,如 aragaer 的回答所示:

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

(但这通常是一个 hacky 解决方法,最好修复库)

您不应该sum在自己的call.hh文件中声明,有一个声明它的标题,您应该使用标题(如果需要extern "C",在标题内部或周围添加#include

于 2013-01-08T01:23:50.160 回答