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; 
}

2つの問題があります。1つは、関数int sum(int、int)を2回宣言したため、コンパイルエラーが発生することです。しかし、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.hC++ ファイルで使用できるようにするには、関数を次のように宣言する必要がありますextern "C"

#ifdef __cplusplus
extern "C" {
#endif

int sum(int x, int y);

#ifdef __cplusplus
}
#endif

次に、定義が宣言と一致するsumようextern "C"に定義すると、再宣言エラーまたは未定義の参照は発生しません。

編集できない場合は、aragaer の回答が示すようtestlib.hに、ブロック内に含めることができます。extern "C"

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

(しかし、これは一般的にハックな回避策であり、ライブラリを修正することをお勧めします)

sum独自のファイルで宣言しないでください。それを宣言するヘッダーがあります。ヘッダーを使用する必要があります (必要に応じて、ヘッダー内またはその周りにcall.hh追加します) 。extern "C"#include

于 2013-01-08T01:23:50.160 に答える