libstdc ++の古いコピーを持っているかもしれないが、他のすべてのツールを持っている他のMacOSXマシンでC++プログラムを実行しようとしています。Linuxのセットアップについて説明しているにもかかわらず、このSOの質問でも言及されているこのアプローチに従おうとしました。私は小さなプログラムtry.cppを持っています:
#include <iostream>
int main() {
int a = 10;
std::cout << a << '\n';
return 1;
}
明らかに、私がそれをコンパイルするだけで、私は得ます
$ /usr/bin/g++ try.cpp
$ otool -L a.out
a.out:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
libSystem.B.dylibへの依存関係を理解しているので、それはそのままにしておくことができます。libstdc ++を取り除くために、私はこれを試します:
$ /usr/bin/g++ try.cpp /usr/lib/libstdc++-static.a
$ otool -L a.out
a.out:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
だから、やってみます
$ ln /usr/lib/libstdc++-static.a .
$ /usr/bin/g++ try.cpp -L.
$ otool -L a.out
a.out:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
また、
$ /usr/bin/g++ try.cpp -L. -lstdc++-static
$ otool -L a.out
a.out:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
最後に、これは機能します:
$ /usr/bin/gcc try.cpp -L. -lstdc++-static
$ otool -L a.out
a.out:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
これで大丈夫ですか?(gccを使用してC++プログラムをlibstdc++にリンクするため)。g ++は、実際にはgccとlibstdc++を使用してC++プログラムをコンパイルするスクリプトであるとどこかで聞いたことがあります。その場合、正しく使用すれば問題ありません。
ただし、実際にはmacportコンパイラとより複雑なプログラムを使用しています。gccはC ++に準拠していますが、いくつかの警告を生成します。効果のあるもの:
ld: warning: std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::~basic_stringbuf() has different visibility (hidden) in /opt/local/lib/gcc44/libstdc++.a(sstream-inst.o) and (default) in /var/folders/2u/2uLPtE+3HMi-BQIEfFVbSE+++TU/-Tmp-//ccoE2rqh.o
これは、c++のコンパイルにgccを使用すべきではないことを示しています。要約すると、質問は次のとおりです。
- libstdc++を静的にリンクする方法
- g ++がそれを行わない場合、gccを使用してlibstdc ++を手動で提供しても大丈夫ですか?では、なぜ視界警告なのか?
- コンパイルされたライブラリの可視性の問題のために2つのアプローチのどちらも機能しない場合は、libstdc ++ソースファイル(sstream.h、list.h、vector.c)などを使用して、コンパイルに含めてください。これによりコンパイルが遅くなりますが、特定のアプリケーションでは役立つ場合があります。それはより良い最適化につながるかもしれません!