4

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)などを使用して、コンパイルに含めてください。これによりコンパイルが遅くなりますが、特定のアプリケーションでは役立つ場合があります。それはより良い最適化につながるかもしれません!
4

2 に答える 2

3

以前の Mac OS X バージョンをターゲットにしたいだけのようですが、libstdc++. Xcode に同梱されている GCC は、デフォルトでホスト環境をターゲットにしていると思います。-mmacosx-version-minただし、ターゲット環境を変更するために呼び出される特別なフラグを処理できます。これにターゲット OS X バージョン番号を指定すると、そのバージョンの Mac OS X と互換性のあるバイナリが自動的に作成されます。

#include <iostream>

int main(void)
{
    std::cout << "Hello world!" << std::endl;
    return 0;
}

次のようにコンパイルします。

g++ -mmacosx-version-min=10.4 test.cpp

私はこのプログラムを 2 回 (1 回はフラグを付けて、もう 1 回はフラグを付けずに) コンパイルし、両方のバイナリを 10.4 を実行している Mac にコピーしました。フラグを付けてコンパイルたものは適切に実行されましたが、フラグを付けにコンパイルしたものは「実行可能ファイルの CPU タイプが正しくありません」と表示されました (OS X の新しいバージョンを実行している同一のマシンでコンパイルされたにもかかわらず)。

一部のヘッダーには、最小ターゲットとして 10.4 を指定した場合、10.5 または 10.6 で導入された関数/クラスを使用できないようにするマクロ ガードがあります (C++ ヘッダーについてはわかりませんが、Cocoa、Foundation、AppKit などのフレームワーク ヘッダー必ずそうします)。

于 2010-10-14T21:06:18.710 に答える
0

これは私の知識の限界ですが、ここにはほとんど反応がありません。

GCC は、リンカも駆動するコンパイラ ドライバです。私の理解では、g++ は単なるコンパイラにすぎません。したがって、G++ を適切にビルドするには、オブジェクト ファイルをビルドして手動でリンクする必要があると思います。現時点ではIDEの脳が損傷しているため、頭のてっぺんからこれを行う方法を言うことはできません。

リンクされている間違ったファイルが原因である可能性があるエラーについては、私は現在 iPhone を使用しているため、印刷されたエラー メッセージを解読するつもりはありません。私は MacPorts のファンではないので、インストールがうまくいかないことに驚かないでください。まず、MacPorts コンパイラで MacPorts ライブラリを使用していることを確認してください。

結局、あなたがやりたいことができることに疑いの余地はありません。ただし、Make ファイルや GCC ツール セットのドキュメントを読み始める必要があります。ファイルをビルドしてプログラムにリンクすることに集中してください。Mac でうまくビルドできる小さなオープン ソース プログラムを見つけて、そこにある Make ファイルを調べてみるとよいでしょう。

もちろん、学ぶのに適した C++ ベースのプロジェクトを見つけるのは簡単ではありません。ただし、LLVM と CLang をインストールすることをお勧めします。特に、新しいリビジョンは C++ に対応していると考えられます。明らかにツールのセットは異なりますが、CLang は問題を解決するか、少なくともより良いデバッグ情報を提供する可能性があります。シンプルでクリーンな make ファイルを使ってオープンソースの C++ プロジェクトに参加できる人がいるかもしれません。私が最近見た中で最も近いのは、HeeksCAD というプロジェクトです。

最終的に、自明ではないものを構築するときは、GCC だけでなく、それ以上のものを必要とすることになります。最近では、その多くが IDE で処理されていますが、XCode を適切に構成して目的の処理を実行できるかどうかはわかりません。

于 2010-10-15T03:24:35.927 に答える