2011-06-21 17 views
0

私は、extern cリンケージを含むC関数をC++コードに含めました。例えば。ライブラリにextern Cリンケージを含む関数を含む

// File Y.cpp: 

extern C { 
void fnA(void) { } 
void fnB(void* a, void* b) { } 
} 

class test { 
.... 
}; 

// end of file 

ファイルYはモジュールModの下にあります。モジュールModのライブラリlibMod-O.aをビルドしている間、Y.hが他のファイル(Mod.cpp)に含まれていない限りクラステストが使用されていない限り、externブロックに含まれる関数は表示されません。ですから、Mod.cppにテストクラスのオブジェクトを作成しない限り、libMod-O.aのextern関数(fnA、fnB)は表示されません.LibMod-O.aのビルド中にY.cppがコンパイルされても表示されません。この結果、別のモジュールがfnA、fnBを使用するときにリンカエラーが発生します。

含まれているextern関数fnAとfnBの間の接続と、Mod.cppのclass testの使用法が表示されません。これが期待されているのですか、これを定義する良い方法がありますか?

+2

時間ファイルにはextern Cの宣言を移動することをお勧めします。この外部ファイルを使用する場合は、このファイルをインクルードしてください。 –

+0

「含まれている関数が表示されない」と言うと、objdumpや他の方法を使ってアーカイブの内容を表示しているということですか、単にリンカのエラーが出るのですか? – dmh2000

+1

fnAを使用するファイルがlibMod-O.aのリンクの後に来るが、オブジェクトテストを伴うMod.cppがlibMod-O.aの前に来るように、fnA/fnBが後で必要となる前にobjファイルが引き込まれるリンク順序の問題があるかもしれません。 gnuリンカーはデフォルトでシングルパスリンカーです。 – dmh2000

答えて

2

あなたはextern "C"を意味します。

CコードとC++コードを明確に分離する必要があります。 YourCCode.hで

:YourCCode.cで

#ifdef __cplusplus 
extern "C" { 
#endif 

void fnA(void); 
void fnB(void* a, void* b); 

#ifdef __cplusplus 
} 
#endif 

void fnA(void) {} 
void fnB(void* a, void* b) {} 

は、コンパイラがCのように、ではないC++としてYourCCode.cをコンパイルしていることを確認します。あなたのC++コードで

#include "YourCCode.h" 

fnA(); 
// etc. 
1

fnAを使用するファイルがlibMod-Oaのリンクの後に来るが、オブジェクトテストを伴うMod.cppがlibMod-Oaの前に来るので、fnA/fnBより前にobjファイルが引き込まれるリンク順序の問題があるかもしれません。後で必要となる。 gnuリンカーはデフォルトでシングルパスリンカーです。

+0

シンボルを見るために文字列やobjdumpを使用しませんでした。私はリンカエラーがあります。 libMod-O.aはMod.cppのライブラリです。 Y.cppとMod.cppはlibMod-O.aにコンパイルされます。それ以外の場合は、Mod.cppでテストオブジェクトを作成することでどのように問題が解決するのかよく分かりません。 – cppcoder

+0

私はstringsコマンドを実行し、libMod-O.aのfnAとfnBを見つけました。しかし、Mod.cppではクラステストが使用されていないため、リンクエラーが発生します。 – cppcoder

関連する問題