2011-08-16 9 views
3

-fPICコマンドで作成された多数の.Oファイルを使用して共有オブジェクトを作成しようとしています。 g ++を-shared引数で実行すると、libstdC++ライブラリに静的にリンクしようとしているように見えますが、これはもちろん失敗します。私はなぜ静的にリンクしようとしているのか理解しようとしています。-static-stdC++引数を使用していないときです。 。私は走ったg ++は、共有オブジェクトのlibstdC++に静的にリンクしようとしています(失敗)

共有オブジェクトを作成するときに使用することはできません:私は、エラー...のlibstdC++(IOS)「のstd :: ios_baseのためのvtable」に対してR_x86_64_325を再配置を取得し、共有オブジェクトを作成しようとすると、

G ++に-V引数を指定して受信し、LDが-lstdC++引数を受け取ることがわかります。

+0

gcc -lstdC++ ...その他のオプションを試してください。結果はどうなりますか? – ks1322

+0

そうではありません。 [他の人のための作品。](http://stackoverflow.com/questions/2001141/why-doesnt-g-link-with-the-dynamic-library-i-create)。 GCCのバージョン?コマンドの入出力? –

+1

'strace -ffo trace.log g ++ ...'の下で実行し、 'libstdc'に対して' trace.log * 'をgrepして、' .a'バージョンを選んだ場所と '.so'を最初に試すかどうか確認します。 –

答えて

3

単一の共有オブジェクトをリンクするときは、既存の.oファイルからこれを行う必要があります。既存の.soファイルからこれを行うことはできません。これらの.soファイルは.soファイルにリンクされますが、 .soファイルにはリンクされません。そこで、gccは.oファイル(.a)のアーカイブを探して見つけ、それらをリンクしようとします。しかし、これらは再配置用にコンパイルされていないため(-fPICなし)、.soファイルの作成には使用できません。

あなたのオプションは以下のとおりです。

  • は動的にlibstdC++にあなたの.soをリンク(ひいては、それがシステムにインストールされているの.soファイルに依存します)のlibstdcため
  • ビルド.oファイル++とそれらをあなたの.soファイルからコンパイルしてください。(ここでは、.oファイルを直接またはarアーカイブとして使用するかどうかは関係ありません)

最初の私はモールを作るために使うメイクファイルからですOC /無料傍受の.soファイル)

gcc -shared -lstdc++ -o your.so yourfiles.o 
+2

あなたが他の質問に答えるように思われるという事実を無視して、 'ld'の' -r'オプションによって活性化される '部分的なリンク'というリンクモードがあります。 –

0

私は、そのライブラリの検索パスに最初に静的ライブラリを見つけること、またはONLY静的ライブラリを見つけることだと思いますわ。適切なバージョンの共有バージョンがインストールされ、見つかっていることを確認します。あなたはおそらくtrussあなたのg ++​​を実行して、それが開かれているライブラリの順序を調べることができます。

関連する問題