私は、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の使用法が表示されません。これが期待されているのですか、これを定義する良い方法がありますか?
時間ファイルにはextern Cの宣言を移動することをお勧めします。この外部ファイルを使用する場合は、このファイルをインクルードしてください。 –
「含まれている関数が表示されない」と言うと、objdumpや他の方法を使ってアーカイブの内容を表示しているということですか、単にリンカのエラーが出るのですか? – dmh2000
fnAを使用するファイルがlibMod-O.aのリンクの後に来るが、オブジェクトテストを伴うMod.cppがlibMod-O.aの前に来るように、fnA/fnBが後で必要となる前にobjファイルが引き込まれるリンク順序の問題があるかもしれません。 gnuリンカーはデフォルトでシングルパスリンカーです。 – dmh2000