プロが教える店舗&オフィスのセキュリティ対策術

Linuxでgccを使ってC言語を勉強してます。

Linuxのgccでコンパイルして作ったプログラムはWindowsでもMacでも動くんでしょうか?

逆にWindowsで作ったのはとか、Macで作ったのは他のOSで動くんだろうかと疑問で・・・。

教えてください!!

A 回答 (8件)

>それぞれのOSで使えるコンパイラでコンパイルしないといけないのですね。



そう。

>文章はテキストファイルだからOKということで。

いや、OKじゃない。

ソースコード(ソースプログラム)はテキストファイルだからOK、と思ったかも知れない。でも、OKじゃなかったりする。

ソースコードに漢字が入ってると、たとえそれがコメント部分だったとしても「漢字コードの違い」があって「単純に持って来ただけ」だと、コンパイルさえ出来ない事もある。

しかも「たとえ漢字が入ってなくても、改行コードの違い」でコンパイルできない場合もある。

コンピュータにとっては「テキストファイル」も「バイナリファイル」も区別出来ない。どっちも単に「何かのデータが並んで格納されてるファイル」に過ぎない。

そして「こういうデータが並んでたら、こういう意味」と言う「約束事」は、MacはMac、LinuxはLinux、WindowsはWindowsで全部違う。

テキストファイルで言えば「漢字の約束事」や「改行の約束事」が全部違う。

だから「単にソースコードを持って来ただけでもダメ」だったりする。

もし「LinuxからMacへ、テキストファイルをコンバートして送るツール」が無かったとしたら「Linuxで紙にプリントアウトして、Macでそれを読みながら手で打ち込み直し」って事になってしまう。

そういう訳で「テキストファイルだからOK」ってのは「甘い考え」だったりする。
    • good
    • 1
この回答へのお礼

ありがとうございます。

テキストファイルだからOKじゃなかったんですね・・・。知りませんでした。

OSが変わったらコンパイルしなおさないといけないし、テキストファイルだからって他のOSに持っていったらOSというわけでもない。

はじめから自分の使いたいOS上で開発をするべきなんですね。

お礼日時:2009/01/30 19:07

そうとうなショボイコンパイラで無い限りANSIに準じているだろうからOSごとの機能を使ったプログラムでなくANSIに準じているものなら基本的にはコンパイルし直せば動く。


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

ありがとうございます。

各OSごとにコンパイルしなおすのがポイントみたいですね。

ちょっとそのほかのところはわかりませんでした。ANSIとかはわかります。

お礼日時:2009/01/22 11:56

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()くらいなら使えます。
    • good
    • 0
この回答へのお礼

詳しいご回答ありがとうございます。

レベルが高くてわからないところもありますが、標準関数だけを使ったものなら、ソースコードはそのままで、そのOSに持っていって、そこでコンパイルすれば動くことが多いのですね。

Macは除く(知らない)とありますが、私はMacでC言語のプログラムを作ったりしたことはないのでOKです!!

お礼日時:2009/01/22 11:53

コンパイラってのは「翻訳者」だよ。


LinuxとかMacとかってのは「国」だと思えば良いよ。
C言語という人が判る言葉をLinux国とかMac国の言葉に変換してくれる。

変換した国の言葉が、他の国と同じ筈ないでしょ?
    • good
    • 0
この回答へのお礼

わかりやすい回答ありがとうございます。

OSは「国」みたいなものでコンパイラて人が「翻訳」をしてくれるんですね!!

お礼日時:2009/01/22 11:49

OSが別々だと、バイナリーレベルでの互換性はありません。


ソースコードのレベルでは、OSが別々でも互換性のある場合があります。
    • good
    • 0
この回答へのお礼

バイナリレベルだとOSで互換性がなくて、ソースコードのレベルでは互換性がある場合があるのですね。

わかってきました。

ありがとうございます。

お礼日時:2009/01/22 11:48

C言語も含む「コンパイル言語」は「特定の環境用」の実行可能ファイルを生成する。


つまり、環境(OS)が違えば動かない。

また、環境専用のライブラリ(関数)なんかもあるわけで、
そういったものを利用したものはソースもコンパイルできないことがほとんど。

Windows上でMacやLinux用の実行ファイルを作ることも場合によっては可能だけど、
それは「クロスプラットフォーム」といって、作ったものはWindowsでは動作しない。
    • good
    • 1
この回答へのお礼

ありがとうございます。

コンパイルとは特定の環境用の実行可能ファイルを作ることなのですね。

環境専用のライブラリというのに特に注意が必要なこともわかりました。

お礼日時:2009/01/22 11:47

動かない。



Mac用はMac上で、Linux用はLinux上で、Windows用はWindows上で、再コンパイルしないといけない。

で「違うパソコンでコンパイルする」んだから「使うコンパイラも違う」事になり「コンパイラが違えば動作も違う」って事になる。

「動作が違う」ってのは「動かない」と同義。

下手すると
#include <stdio.h>
int main(void)
{
 printf("Hello world\n");
}
でさえ「同じには動かない」事もある。動かないどころか、コンパイルさえ出来ない事も。

じゃなかったら、ソフトハウスは「移植」で金取れないよ。
    • good
    • 0
この回答へのお礼

それぞれのOSで使えるコンパイラでコンパイルしないといけないのですね。

文章はテキストファイルだからOKということで。

ありがとうございます。

お礼日時:2009/01/22 11:45

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

    • good
    • 0
この回答へのお礼

ありがとうございます。

コンパイルした結果は異なるのですね。

お礼日時:2009/01/22 11:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!