5

重複の可能性:
リンク時に静的ライブラリと共有オブジェクト ライブラリを混在させることはできますか?

アプリをコンパイルして、boost_system ライブラリのみを静的にリンクしたいと考えています。その他 (glibc など) は動的にリンクする必要があります。どうすればできますか?

動的にコンパイルする私のコマンド:

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

静的にコンパイルするコマンド:

g++ -static  -o newserver  server.cpp ... -pthread -lboost_system -std=c++0x

しかし、このコマンドはすべて静的にリンクします! そして、アプリの重量は 2 MB 増えます!

ブーストライブラリのみを静的にコンパイルするコマンドを教えてください。

ありがとう!

4

2 に答える 2

8

に置き換え-lboost_systemます-Wl,-Bstatic -lboost_system -Wl,-Bdynamic。この-Wlオプションは、コマンドラインに表示される順序で、その後にあるものをリンカーに送信します。

于 2013-01-30T13:39:35.353 に答える
2

解決策は 2 つあります。-Bstaticコマンド ラインでと を指定できます-Bdynamic。それぞれは、それに続くすべてのライブラリに影響します。または、静的にリンクしたいライブラリの静的バージョンが、動的バージョンを含むディレクトリの前に検索されるディレクトリに存在するように調整できます。これにより、ある種のグローバルな決定を行うことができます。ディレクトリを一度作成すると、一般的なユーザーが静的バージョンを使用する-L前に、ディレクトリに対して 行うすべてのユーザーが作成されます。-L

実際には、Boost ライブラリを静的以外にリンクしたい場合は考えられないので、最も簡単な解決策は.soファイルを削除することかもしれません。g++ が決定を下す (および考慮に入れる) のは、両方が同じディレクトリにある場合のみ-Bstatic です-Bdynamic。指定された順序でディレクトリを検索し、ライブラリの静的バージョンまたは動的バージョンのいずれかを含むディレクトリを見つけると停止します。また、存在するバージョンが 1 つだけの場合は、関係なくそのバージョンを使用します。

于 2013-01-30T13:43:45.583 に答える