5

C プログラミングでは、.so ファイルがヘッダー ファイルで宣言されているすべてのシンボルを提供している限り、オブジェクト ファイルは .so ファイルと正常にリンクできると考えていました。

foo.c、bar.h、および 2 つのライブラリ libbar.so.1 と libbar.so.2 があるとします。libbar.so.1 と libbar.so.2 の実装は全然違いますが、どちらも bar.h で宣言された関数を提供していれば問題ないと思います。

foo.o を libbar.so.1 にリンクし、実行可能ファイル foo.bin を作成しました。この実行可能ファイルは、libbar.so.1 が LD_LIBRARY_PATH にある場合に機能しました (もちろん、シンボリック リンクは libbar.so として作成されます)。しかし、シンボリック リンクを libbar.so.2 に変更すると、foo.bin が実行できず、これに不満がありました。 :

 undefined symbol: _ZSt4cerr

libbar.so.1 は C++ でビルドされたライブラリですが、libbar.so.2 は AC でビルドされたライブラリです。foo.bin は純粋な C コード foo.c に基づいて構築されているため、foo.bin が libbar.so.1 自体でのみ意味を持つ C++ 関連のシンボルを必要とする理由がわかりません。

4

4 に答える 4

3

_ZSt4cerr は明らかに壊れた C++ 名です。適切なコンパイラを使用しているかどうかを確認する必要がある場合があります (gcc/g++、ばかげているように聞こえることはわかっていますが、たまたまそのような混乱に遭遇しました ;))。 cerr を参照。

于 2010-03-03T08:58:23.873 に答える
2

検索する前に、C++ 名をデマングルする必要があります。gcc には c++filt ユーティリティがあります。

$ c++filt
_ZSt4cerr
std::cerr

これは単なる標準エラー ファイル ストリームです。

于 2010-03-03T08:59:08.280 に答える
0

質問の文は間違っています。あなたは「ヘッダーファイル」と言います。「 (唯一の) ヘッダー ファイルなどというものはありません。「特定の C++ クラスを宣言するヘッダー ファイル」という意味であれば、そのクラスは他のクラスから継承されている可能性があります。または、例外を使用する場合もあります。またはRTTI。その場合、デフォルトでは、それに付随するコードを含む .so に「ぶら下がっている未定義のシンボル」が含まれます。デフォルトでは、「メイン」プログラムは C++ であり、C++ ランタイムにリンクされていることが期待されます。

自己完結型の .so を作成することは可能ですが、それを作成するには追加の作業を行う必要があります。-Bsymbolicを使用するか、リンク時にいくつかの -l ライブラリを指定するか、またはその両方が必要になる場合があります。この地域は十分に文書化されておらず、一般的に考古学が必要です。

于 2010-03-14T23:53:11.047 に答える
0

おそらく、プログラム全体を C++ 標準ライブラリにリンクするのを忘れただけでしょう。

于 2010-03-03T09:01:58.087 に答える