2011-12-16 10 views
1

Mac OS Xマシンにインストールされているgccおよびg ++コンパイラは、Ubuntu(Linux)GNU gccおよびg ++コンパイラとは異なりますか?GNU gccおよびg ++

私はEclipseを使ってC++プログラムを開発していますが、MacOSX GCCと呼ばれるツールチェーンセクションがあり、実行可能ファイルもLinuxマシン上で実行できるように別のコンパイラをインストールする必要があるかどうかは疑問でした。

私はC++開発の技術的な詳細について少し熟知していますので、この質問が理にかなっていれば申し訳ありません。

+5

gccのバージョンがUbuntuと同じであっても、出力されるプログラムは異なります。 1つは、LinuxのプログラムはELFの実行形式を使用していますが、Macはそうではありません(私は彼らが何を使用しているか覚えていません。あなたが記述しているのは、クロスコンパイルと呼ばれ、それでも単一のバイナリが両方のプラットフォームではほとんど実行されません(それぞれ別のプログラムをコンパイルする必要があります)。 –

答えて

1

バイナリがMacとLinuxの両方で実行されることはほとんどありません。もしバイナリがLinuxの異なるディストリビューションの間で実行されないのなら、かなり可能性があります。 OSごとにバイナリをコンパイルすることもできます。または、アプリケーションのソースコードを配布して、ユーザーが自分でコンパイルできるようにすることもできます。

異なるバージョンのlibstdC++。soはおそらく異なるOSで配布されているため、問題が発生します。部分的に動作する解決策は、バイナリを静的にコンパイルすることです。そのため、インストールされているターゲットシステムのバージョンに依存しません。

+1

Linuxプラットフォームで開発したコードにMacで行った変更が、変更後にLinuxプラットフォームでコンパイルしようとすると問題が発生する可能性はありますか?つまり、異なるプラットフォーム間でバイナリが壊れやすいのですが、実際のソースコードはどうですか? – Cemre

+1

非常に非常にそうです。これは、ポータブルコードの作成が難しい理由です。純粋なANSI CまたはC++に固執するならば、問題のない任意のプラットフォームでコードをコンパイルする必要があります。しかし、例えば、エンディアンの順序付けなどの特定のgotchyaがあります。最大ファイル名の長さのデフォルト値、特定のタイプのサイズです。 #ififを使用して対処している違いを知ったら、#ififを実行してください。#elif WEIRD_OSは#endifを実行します。過去のジョブの例として、8つの異なるOSと4つの主要な私たちのソフトウェアの。効果的に私たちは300種類以上のコードをサポートしていました:-) –

+2

またMac OSでは、異なるプロセッサを対象にしていても、同時に32ビットと64ビットのコードを含む汎用バイナリを作成できます。 Linuxではそうではありません。バイナリではなく、ソースの互換性を現実的に実現できます。同じコードは通常MacとLinuxでコンパイルされますが、特にx86を対象とし、GUIを持たない場合はほとんど違いがありません。しかし、さまざまなプラットフォーム用にコンパイルする必要があります(異なるディストリビューションの場合もあります)。最近のUbuntuをビルドすると、バイナリは古いディストリビューションでは動作しません。静的リンクは、実行可能ファイルに役立ちますが、共有オブジェクトでは役に立ちません。 –

0

MacOSはLinuxではありませんが、BSDと共通しているかもしれませんが、Linuxでは間違いありません。同じコンパイラの異なる構成を使用することもできますが、プログラムは互換性がありません。

両方で同じプログラムを実行する唯一の方法は、Wineのような互換性レイヤを提供する場合です。