1

Windows、Linux、および Mac で展開する共有ライブラリを作成しています。Linux 側では、ライブラリの依存関係をできるだけ少なくしようとしています。最終開発者がライブラリが内部で何を使用しているかについて心配する必要はまったくありません。特に、何かをインストールするように強制したくありません。

現在、ライブラリで ldd を実行すると、次のように表示されます。

    linux-gate.so.1 =>  (0xf57fe000)                                        
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb773d000)     
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb7654000)   
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74a1000)                 
    /lib/ld-linux.so.2 (0xb7782000)                                         
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb745d000)                 
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7440000)         

これは私にはかなり合理的に見えますが、これらのライブラリのいくつかは、それが何であるかよくわかりません。この依存関係のリストが妥当かどうか、またはこれらのいくつかを取り除くことができるかどうか、誰か教えてもらえますか? この依存関係のリストを使用して、ライブラリはさまざまな Linux 構成およびディストリビューションで実行されますか? それが私が目指しているもの、最大の携帯性です。

コンパイル時に、フラグ -static-libgcc を指定しています。たとえば、C++ 標準ライブラリにもリンクするように指定できるフラグは他にありますか? 内部的には、私のライブラリは C++11 で std::thread を使用していますが、アプリケーションの作成者にそれを強制的に利用させたくありません (たとえば、古いバージョンの GCC を使用している場合)。

アップデート:

-static-libgcc に加えて、-static-libstdc++ を指定しています。私の依存関係リストは次のようになります。

    linux-gate.so.1 =>  (0xf57fe000)                                        
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7737000)     
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7584000)                 
    /lib/ld-linux.so.2 (0xb77a2000)                                         

気になるのは、libc.so.6 と linux-gate.so.1 だけです。これらが何であるかわかりません。それらは古いものですか? もしそうなら、それらは長い間後方互換性を保っていますか? もしそうなら、私はそれらを動的にリンクし続けますが、それ以外の場合は調査を続ける必要があります. ヒントをいただければ幸いです。

4

1 に答える 1

1

linux-gate.so.1 は仮想 DSO であり、実際には存在しません。それを説明する最良の方法は、このリンクここを読むことです。

あなたの質問に答えるには、両方に動的にリンクし続け、いくつかの異なるビルドを実行して、異なるディストリビューションをターゲットにすることが最善の選択だと思います。通常、Ubuntu 用にビルドすると、いくつかの Debian Linux システムで動作することがわかりました。

于 2013-08-29T14:28:01.860 に答える