web-dev-qa-db-ja.com

clangを使用した静的リンクlibstdc ++

GCCを使用する場合、次を使用してUbuntu15.04でプログラムをビルドできます。

-static-libgcc -static-libstdc++

また、コンパイルされたバイナリは、外部パッケージなしで「ストック」Ubuntu 14.04で実行でき、標準の更新のみです。

clangのライブラリへのこの静的リンクでビルドする可能性はありますか?

最も一般的な答え:

  • テストubunturepを使用する(ppa:ubuntu-toolchain-r/test
  • 更新サーバー
  • ターゲットサーバーで再コンパイルします
  • gCCを使用しないでください

私には適していません。

Ubuntu 14.04.3 LTSで実行するためにclangでこれを行うことはできますか?

11
vladon

この点でclangはgccと互換性があります。基本的に、iostreamを使用してlibstdc++要件を確保するhello-worldプログラムの場合(実際のlibバージョンはディストリビューション間で異なる場合があります)。

$ clang++ test.cpp
$ ldd ./a.out
        linux-vdso.so.1 (0x00007ffec65c0000)
        libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libstdc++.so.6 (0x00007ff937bb6000)
        libm.so.6 => /lib64/libm.so.6 (0x00007ff9378b6000)
        libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/libgcc_s.so.1 (0x00007ff93769e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007ff9372fe000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff937f3e000)

libstdc++libgcc_sの依存関係は次のとおりです。ただし、-static-libgcc -static-libstdc++を追加すると:

$ clang++ test.cpp -static-libgcc -static-libstdc++
$ ldd ./a.out
        linux-vdso.so.1 (0x00007ffe5d678000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fb8e4516000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb8e4176000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb8e4816000)

それでもlibcへの依存は残りますが、それは別の質問です。

clang: warning: argument unused during compilation: '-static-libstdc++'は、現在の状況ではフラグが役に立たないため、clangがこのフラグを無視したことを意味します。頭に浮かぶ最初の2つの例は、Cコードのコンパイル(明らかにlibstdc ++に依存しない)、またはリンクせずにコンパイル専用コマンドを発行すること(-cフラグ)です。 .oファイルは静的または動的リンクに関する情報を保持できないため、このフラグはリンクフェーズで指定する必要があります(警告を回避するために、リンクフェーズでのみ)。

14
keltar

-static-libstdc ++または-static-libgccを使用する代わりに、clangの-staticフラグを使用してください。必要なものすべてが静的にリンクされた、動的でない実行可能ファイルを生成します。

私のテストプログラムでは、次のようになります。

[root@interserver ogrerobot.com]# ldd ./CppUtilsSpikes  
not a dynamic executable
0
zertyz