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