3

私は次の問題を抱えていますが、それは良い解決策がないようです。

たとえば、libtiffとlibX11を使用するCLIユーティリティがあります。このユーティリティの2つのバージョンを作成したいと思います。動的リンクと静的リンクです(可能な限り多くの依存関係がコンパイルされています)。

動的リンクの場合、すべてが魅力として機能します。指定する必要があり-ltiff -lX11、リンカーは、libtiff.soおよびを参照する優れた実行可能ファイルを生成しますlibX11.so

静的リンクの場合、状況はさらに悪化します。次のコマンドを使用すると、次のようになります。

g++ -static-libgcc -Wl,-static -o my.out *.o -lc -ltiff -lX11

libtiff.aとlibX11.aで欠落しているシンボルで終わります。OK、依存しているすべてのライブラリを行に入れることができます。

g++ -static-libgcc -Wl,-static -o my.out *.o -lc -ltiff -ljpeg -lz -lX11 -lXau -lxcb -lXdmcp

しかし、私にとってこの発見を可能にするツールはありますか?libtoolはここで役立ちますか(わかります/usr/lib/libtiff.laが、ありません/usr/lib/libX11.la)?誰かがlibtoolの基本的な例を教えてもらえますか?libtiff一部のプラットフォームでより狭い機能が提供され、そのプラットフォームではまったく利用できないリンクがない場合、状況は重大ですlibjpeg。そのため、ライブラリの依存関係が満たされないため、上記のリンクコマンドは失敗します。

2番目の問題はその警告によるものです(私は信じています):

/usr/lib/libX11.a(xim_trans.o): In function `_XimXTransSocketUNIXConnect':
(.text+0xcda): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

ユーティリティは、出力libcに表示されたままのに対して静的にリンクされていません。この場合、静的lddに正しくリンクするにはどうすればよいですか?libX11libc

この.a質問は関連性がありますが、システムファイルを再パックすることはお勧めできません。

4

2 に答える 2

3

X11R7ライブラリのように.pcファイルを提供するライブラリの場合は次のようにします。pkg-config

% pkg-config --static --libs x11
-lX11 -lpthread -lxcb -lXau  

残念ながら、pkg-config --list-alllibtiffをそれらを提供するライブラリの1つとして表示していないようですが、少なくともlinkコマンドを次のように変換できます。

g++ -static-libgcc -Wl,-static -o my.out *.o -lc -ltiff -ljpeg -lz `pkg-config --static --libs x11`

そして、libX11のそのバージョンが必要とするライブラリを追跡することを心配する必要はありません(libxcbは最近までオプションであったため、古いLinuxディストリビューションにはない可能性があります)。

于 2010-11-14T18:26:45.143 に答える
0

あなたの場合、glibcの静的リンクは悪い考えです。混合リンクを使用することをお勧めします。

于 2012-10-03T13:33:36.080 に答える