14

静的に glibc ライブラリにリンクしているアプリをコンパイルするにはどうすればよいですか? (すべての lib ではありません)

今私のコンパイルコマンド:

g++  -o newserver  test.cpp ... -lboost_system -lboost_thread -std=c++0x

ありがとう!

4

2 に答える 2

8

それ-staticが(別の回答で説明されているように)行うことです:不要なモジュールはプログラムにリンクされません。しかし、必要なものの量に対するあなたの期待は(ある意味で、リンカーに反対を納得させることができないという意味で) 楽観的すぎるかもしれません。

移植性 (古い glibc などを使用する他のマシンで実行可能ファイルを実行する) のためにそれを実行しようとしている場合は、必要なものが得られるかどうかを確認するための簡単なテストの質問が 1 つあります。

問題について考えましたlibnssか?

あなたの答えが「はい」の場合は、続行するのが理にかなっているかもしれません。答えが「いいえ」の場合、または質問が曖昧すぎて答えがない場合は、静的にリンクされた glibc で有効期限を終了してください。

于 2013-01-28T17:41:31.727 に答える
4

-staticコンパイル行に追加します。アプリケーションが必要とするものだけを追加します [もちろん、アプリケーションが呼び出す関数、およびそれらの関数が呼び出すすべての関数 (一連のスタートアップ コードやその他のビットとピースを含む)] を追加するため、約 800K になります ( x86 マシン上の単純な「hello world」プログラム)。他のアーキテクチャは異なります。ブーストはおそらく標準ライブラリも少しは呼び出すため、アプリケーションに 800K 以上を追加する可能性があります。ただし、ライブラリ全体 (共有ライブラリとして約 2MB) ではなく、最終的なバイナリのいずれかのコードで使用される関数のみが適用されます。

リンク glibc のみが必要な場合は、リンク行を compile to: に変更する必要があります -Wl,-Bstatic -libc -Wl,-Bdynamic。これにより、他のライブラリが静的にリンクされるのを防ぐことができます [これらのステートメントを複数持つ必要がある場合があります。別のライブラリによって取り込まれたものが、glibc から「さらに」取り込まれる必要がある場合があるためです - 心配しないでください'リンカが必要と考える以上のものを持ち込まない]。

于 2013-01-28T17:32:44.680 に答える