2

プロジェクトの標準ライブラリを静的にリンクしようとしています。SO および他のサイト ( http://www.trilithium.com/johan/2005/06/static-libstdc/ )のさまざまなスレッドから静的リンク オプションのいくつかのバリエーションを試しましたが、いずれも望ましい結果が得られませんでした。 .

これが私の現在のフラグ設定です:

g++ -Wall -g -static-libgcc -static-libstdc++ -Iinclude -std=c++11

私も試しました:

g++ -Wall -g -Wl,-Bstatic -lstdc++ -std=c++11

これらのバリエーションのいずれかを使用すると、lddstillの出力は次のようになります。

linux-gate.so.1 => (0xb77b1000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0x4e085000)
libm.so.6 => /lib/libm.so.6 (0x4daf0000)
libgcc_s.so.1 -> /lib/libgcc_s.s0.1 (0x4dd1f000)
libc.so.6 => /lib/libc.so.6 (0x4d90a000)
/lib/ld-linux.so.2 (0x4d8e7000)

実行fileすると、動的にリンクされたバイナリであることもわかります。Fedora 18、Ubuntu 12.04、CentOS などの複数のディストリビューションでこれを試しましたが、役に立ちませんでした。

4

2 に答える 2

0
g++ -Wall -g -static-libgcc -static-libstdc++ -std=c++0x hello.cpp

ldd からのこの出力で

linux-vdso.so.1 =>  (0x00007fffef928000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbe12439000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbe12822000)

私のUbuntu 12.04で仕事をします。また、Ubuntu 12.04でサポートされているgcc/g++バージョンを使用しているとは思えません。これはg ++ 4.6であり、g ++ 4.6は-std=c++11フラグを提供していないためです。

g++ -std=c++0x -static hello.cpp

これは、すべてを単一の静的オブジェクトにコンパイルすることでも期待どおりに機能します。

私の源hello.cpp

#include <iostream>

int main(int argc, char* argv[])
{
  [](void){std::cout << "hello" << std::endl;}();
  return(0);
}

さまざまなコンパイラまたはプラットフォームでサポートされていないコンパイラで遊んでいると思います.コンパイラのバージョンについて自分で文書化してください.このフラグは機能します.問題はおそらくインストールまたはコンパイラの設定です.

于 2013-03-28T19:23:22.073 に答える
0

-static-libgcc -static-libstdc++ を他の静的ライブラリ (protobuf、pthread、rt) とリンクしようとしましたが、毎回別の問題が発生しました。

私が見つけた解決策は、外部ツールErmineを使用することで、すべての問題を解決してくれました。基づく:スタティファイア

于 2015-07-14T16:35:42.343 に答える