将gcc与g ++代码链接起来

时间:2013-01-07 07:12:47

标签: 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)'

我该如何解决?

2 个答案:

答案 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"如有必要)