我正在尝试链接程序中已存在的库。我的程序是用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)'
我该如何解决?
答案 0 :(得分:3)
extern "C" {
#include "testlib.h"
}
并且不要自己声明。应该工作。
答案 1 :(得分:0)
要使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"
}
(但这通常是一个hacky解决方法,最好修复库)
你不应该在自己的sum
文件中声明call.hh
,有一个标题声明它,你应该使用标题(在标题内或{{1}附近添加extern "C"
如有必要)