9

OSX 10.6ユキヒョウが提供するgccコンパイラを理解するのに苦労しています。これは、主に64ビット環境での経験が不足しているためです。

$ cat >foo.c
main() {}
$ gcc foo.c -o foo
$ file foo
foo: Mach-O 64-bit executable x86_64
$ lipo -detailed_info foo
input file foo is not a fat file
Non-fat file: foo is architecture: x86_64

ただし、私のアーキテクチャはIntel i386タイプと見なされます(最新のIntel Core2デュオMacBookの1つを使用しています)

$ arch
i386

コンパイラはi686-apple-darwin10をターゲットにしています

$ gcc --version 
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)

もちろん、32ビットをコンパイルすると、32ビットの実行可能ファイルが得られます。

$ gcc -m32 foo.c -o foo
$ file foo
foo: Mach-O executable i386

しかし、全体像はわかりません。コンパイラのデフォルト設定は、32ビットマシンを使用していると言っているアーチがある場合でも、x86_64実行可能ファイルを生成することです(なぜ?Core2は64です)。(私が推測する)32ビットカーネルを実行している場合でも、i686-apple-darwinプラットフォームをターゲットとするコンパイラを使用している場合でも。なんで?彼らはどのように走ることができますか?64または32をコンパイルする必要がありますか?

この質問は、Macでgcc 4.2.3をコンパイルしようとしたためですが、gmp、mpfr、およびlibibertyが(場合によっては)x86_64用にコンパイルされるという問題がたくさんあります。すべてのx86_64をコンパイルする必要がありますか?もしそうなら、ターゲットは何ですか(私が推測するi686-apple-darwin10ではありません)?

助けてくれてありがとう

4

4 に答える 4

15

Snow Leopardのデフォルトのコンパイラはgcc4.2であり、そのデフォルトのアーキテクチャはx86_64です。Macソフトウェアを構築する一般的な方法は、別々のパスで複数のアーキテクチャを構築し、lipoを使用して結果を結合することです。(lipoは、シングルアーチファイルをマルチアーチファイルにコンパイルするか、マルチアーチファイルからアーチを取り除くだけです。ご存知のように、シングルアーチファイルにはユーティリティがありません。)

コンパイラのビットネスは何の関係もありません。64ビットコンパイラを使用して32ビットバイナリを構築できます。その逆も可能です。(コンパイラの「ターゲット」は実際には実行可能ファイルであると思いますが、これは異なります。)

カーネルのビットネスは何の関係もありません。32ビットカーネルで起動すると、64ビットバイナリをビルドして実行できます。その逆も可能です。

重要なのは、リンクするときに、リンクに適切なアーキテクチャがあるかどうかです。32ビットビルドを64ビットバイナリに対してリンクすることはできません。その逆も同様です。したがって、重要なことは、リンクライブラリのアーキテクチャが何であるかを確認し、それらが一貫していることを確認してから、同じアーキテクチャのバイナリを構築して、既存のライブラリに対してリンクできるようにすることです。

于 2009-09-21T17:34:57.433 に答える
2

i686-apple-darwin10.0.0には、ほとんどのバージョンのautotoolsでは理解されないx86_64フォルダーが含まれています。言い換えれば、gccコンパイラは残念ながらSnowLeopardの冗談にほかなりません。32ビットと64ビットのライブラリをi686-apple-darwin10.0.0にバンドルする理由は私にはわかりません。

$ ls /usr/lib/gcc
i686-apple-darwin10 powerpc-apple-darwin10

* 86- darwinディレクトリを検索してから、私が想像する64ビットライブラリを検索するように、すべてのautotools構成ファイルを変更する必要があります。

あなたのシステムと同じように、私のmac miniは、明らかに64ビットプラットフォームを使用しているにもかかわらず、i386と言っています。これも、64ビットハードウェアで配布されているため、別の間違いです。

$arch
i386
于 2009-10-28T15:24:33.070 に答える
1

Appleツールチェーンは複数のアーキテクチャをサポートしています。x86およびx86_64コードを含むファットバイナリを作成する場合は、パラメータ-arch i386 -arch x86_64をgccに渡す必要があります。コンパイラーは、一度に両方のプラットフォーム用にコードを2回コンパイルします。

CFLAGSに追加-arch i386 -arch x86_64すると、gmp、mpfrなどを複数のアーチ用に一度にコンパイルできる場合があります。そのようにlibusbを構築することは、私にとってはうまくいきました。

于 2013-08-27T06:48:37.547 に答える
0

この答えは間違っていますが、以下のコメントを参照してください

本当の問題は...どうやって32ビットバージョンのOSXを入手したのですか?AppleのIntelチップはすべてx86_64アーキテクチャをサポートするCore2またはXeonであるため、SnowLeopardに32ビットバージョンあることを知りませんでした。

ああ、SnowLeopardはIntelチップでのみ動作します。

編集:どうやらSnowLeopardは32ビットモードで起動します。

于 2009-09-21T17:39:24.397 に答える