链接gcc与g++代码



我正在尝试链接程序中已经存在的库。我的程序是用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("的未定义引用

我该怎么修?

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

不要自己申报。应该有效。

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

#ifdef __cplusplus
extern "C" {
#endif
int sum(int x, int y);
#ifdef __cplusplus
}
#endif

然后,当您将sum定义为extern "C"时,定义与声明匹配,并且不会得到重新声明错误或未定义的引用。

如果你不能编辑testlib.h,那么你可以将其包含在extern "C"块中,正如aragaer的答案所示:

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

(但这通常是一个棘手的解决方法,最好修复库(

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

最新更新