• ベストアンサー

C言語で作ったらWindowsでもMacでもLinuxでも動くんですか?

Linuxでgccを使ってC言語を勉強してます。 Linuxのgccでコンパイルして作ったプログラムはWindowsでもMacでも動くんでしょうか? 逆にWindowsで作ったのはとか、Macで作ったのは他のOSで動くんだろうかと疑問で・・・。 教えてください!!

質問者が選んだベストアンサー

  • ベストアンサー
回答No.8

>それぞれのOSで使えるコンパイラでコンパイルしないといけないのですね。 そう。 >文章はテキストファイルだからOKということで。 いや、OKじゃない。 ソースコード(ソースプログラム)はテキストファイルだからOK、と思ったかも知れない。でも、OKじゃなかったりする。 ソースコードに漢字が入ってると、たとえそれがコメント部分だったとしても「漢字コードの違い」があって「単純に持って来ただけ」だと、コンパイルさえ出来ない事もある。 しかも「たとえ漢字が入ってなくても、改行コードの違い」でコンパイルできない場合もある。 コンピュータにとっては「テキストファイル」も「バイナリファイル」も区別出来ない。どっちも単に「何かのデータが並んで格納されてるファイル」に過ぎない。 そして「こういうデータが並んでたら、こういう意味」と言う「約束事」は、MacはMac、LinuxはLinux、WindowsはWindowsで全部違う。 テキストファイルで言えば「漢字の約束事」や「改行の約束事」が全部違う。 だから「単にソースコードを持って来ただけでもダメ」だったりする。 もし「LinuxからMacへ、テキストファイルをコンバートして送るツール」が無かったとしたら「Linuxで紙にプリントアウトして、Macでそれを読みながら手で打ち込み直し」って事になってしまう。 そういう訳で「テキストファイルだからOK」ってのは「甘い考え」だったりする。

rabitwo
質問者

お礼

ありがとうございます。 テキストファイルだからOKじゃなかったんですね・・・。知りませんでした。 OSが変わったらコンパイルしなおさないといけないし、テキストファイルだからって他のOSに持っていったらOSというわけでもない。 はじめから自分の使いたいOS上で開発をするべきなんですね。

その他の回答 (7)

  • xyz951
  • ベストアンサー率18% (15/79)
回答No.7

そうとうなショボイコンパイラで無い限りANSIに準じているだろうからOSごとの機能を使ったプログラムでなくANSIに準じているものなら基本的にはコンパイルし直せば動く。 C言語って標準入出力は結構貧弱ですから各OSというかコンパイラで独自にグラフィックライブラリとかGUIライブラリなど拡張しているのが多いですからね。 GUIライブラリはものによっては複数のOSで提供されているものはあります。(QTやGTK+などはクロスプラットフォーム) また、WideStudio/MWTの様にクロスプラットフォームに対応したものもあります。(その場合、各OSごとにコンパイルをやり直せば基本的には動きます。)

rabitwo
質問者

お礼

ありがとうございます。 各OSごとにコンパイルしなおすのがポイントみたいですね。 ちょっとそのほかのところはわかりませんでした。ANSIとかはわかります。

回答No.6

Linuxでプログラミング・・・って事は、OSの元で動くプログラムですね。 GUIプログラミングかCUIプログラミングかによって回答が違ってきますが、CUIプログラミングでprintf()とかfopen()とかfgets()とかisdigit()とかの標準ライブラリを使ったプログラミングであると仮定してお話しします。 こういったプログラムは、コンソールで動作させますが、Linux(UNIX)のターミナル、MS-DOS(Windowsのコマンドプロンプト)では、再コンパイルをかければ、ほぼ動きます。(Macは知らない) 動かないのは、C標準ライブラリ以外のOS依存系のライブラリを使用したものやCPU依存の部分があったときなどです。 確か、MS-DOSのCコンパイラ(Microsoftの!!)のライブラリにgetch()なんて関数(だかマクロ)があって、キーボードから1文字読み込むっていう動作をしました(MS-DOSのシステムコールを利用していた)。 UNIXには、pipe()やfork()などという関数があります(ただし正確にはfork()はシステムコール)。 これは、Cの標準関数ではないので、他のOSの元では再コンパイルもできないでしょう。 また、メモリサイズの関係で、プログラムによってはMS-DOSやCP/Mでは動かせないことも。(おそらく、ここで質問しているレベルでは無関係かな?) あまりにメモリを消費するプログラムは、OSのメモリ管理能力によっては動作できません。 ちなみに、組み込みでも標準出力をRS-232Cにして端末につなげば、printf()くらいなら使えます。

rabitwo
質問者

お礼

詳しいご回答ありがとうございます。 レベルが高くてわからないところもありますが、標準関数だけを使ったものなら、ソースコードはそのままで、そのOSに持っていって、そこでコンパイルすれば動くことが多いのですね。 Macは除く(知らない)とありますが、私はMacでC言語のプログラムを作ったりしたことはないのでOKです!!

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.5

コンパイラってのは「翻訳者」だよ。 LinuxとかMacとかってのは「国」だと思えば良いよ。 C言語という人が判る言葉をLinux国とかMac国の言葉に変換してくれる。 変換した国の言葉が、他の国と同じ筈ないでしょ?

rabitwo
質問者

お礼

わかりやすい回答ありがとうございます。 OSは「国」みたいなものでコンパイラて人が「翻訳」をしてくれるんですね!!

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

OSが別々だと、バイナリーレベルでの互換性はありません。 ソースコードのレベルでは、OSが別々でも互換性のある場合があります。

rabitwo
質問者

お礼

バイナリレベルだとOSで互換性がなくて、ソースコードのレベルでは互換性がある場合があるのですね。 わかってきました。 ありがとうございます。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.3

C言語も含む「コンパイル言語」は「特定の環境用」の実行可能ファイルを生成する。 つまり、環境(OS)が違えば動かない。 また、環境専用のライブラリ(関数)なんかもあるわけで、 そういったものを利用したものはソースもコンパイルできないことがほとんど。 Windows上でMacやLinux用の実行ファイルを作ることも場合によっては可能だけど、 それは「クロスプラットフォーム」といって、作ったものはWindowsでは動作しない。

rabitwo
質問者

お礼

ありがとうございます。 コンパイルとは特定の環境用の実行可能ファイルを作ることなのですね。 環境専用のライブラリというのに特に注意が必要なこともわかりました。

回答No.2

動かない。 Mac用はMac上で、Linux用はLinux上で、Windows用はWindows上で、再コンパイルしないといけない。 で「違うパソコンでコンパイルする」んだから「使うコンパイラも違う」事になり「コンパイラが違えば動作も違う」って事になる。 「動作が違う」ってのは「動かない」と同義。 下手すると #include <stdio.h> int main(void) {  printf("Hello world\n"); } でさえ「同じには動かない」事もある。動かないどころか、コンパイルさえ出来ない事も。 じゃなかったら、ソフトハウスは「移植」で金取れないよ。

rabitwo
質問者

お礼

それぞれのOSで使えるコンパイラでコンパイルしないといけないのですね。 文章はテキストファイルだからOKということで。 ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「コンパイルした結果」はすべて異なるものと思え.

rabitwo
質問者

お礼

ありがとうございます。 コンパイルした結果は異なるのですね。

関連するQ&A