質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

3回答

8700閲覧

実行ファイルの再コンパイルについて

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2016/12/26 23:23

ELF や exeといった実行ファイルについてなのですが・・・
とある環境で一度コンパイルしたものをUSBなどにコピーして、別のコンピュータなどに移動すると、再コンパイルが必要になるものとそうでないものがあります。
(移動先のコンピュータはコンパイルした環境のOSと同じOSです)

(windows GUI)win32 API / C++ --- 再コンパイル必要無し。
(windows CUI)exe / C --- 確認していませんが、おそらく再コンパイル必要。
(Linux CUI)ELFファイル / C --- 再コンパイルの必要あり。

こんな感じかと思います。
そこで、、、、
なぜ、別の環境に移すと再コンパイルが必要になるのでしょうか??
Linux の場合はサーバーなどのセキュリティ保護のためかな・・・と思ったのですが。

Linuxやwindowsで別のコンピュータに移しても、再コンパイルなしで実行させることは可能なのでしょうか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こんにちは。

とある環境で一度コンパイルしたものをUSBなどにコピーして、別のコンピュータなどに移動すると、再コンパイルが必要になるものとそうでないものがあります。

(移動先のコンピュータはコンパイルした環境のOSと同じOSです)

(windows GUI)win32 API / C++ --- 再コンパイル必要無し。

(windows CUI)exe / C --- 確認していませんが、おそらく再コンパイル必要。
(Linux CUI)ELFファイル / C --- 再コンパイルの必要あり。

この認識は間違っています。
同じOSなら原則として同じバイナリが走ります。(再コンパイルしてもできるものは事実上同じものです。)
WindowsでもlinuxでもOSのインストーラに同梱されているCUIツールって本当に多数ありますが、OSのインストール時に再コンパイルしてないですよ。

更に、CUIツールの再コンパイルが必要だった場合、コンパイラはどうやって入手します?
コンパイラもCUIです。確認してはいませんが、gccもELFファイル形式で配布されているのではないでしょうか?
gccの再コンパイルが必要だとすると悪夢ですね。

Linuxやwindowsで別のコンピュータに移しても、再コンパイルなしで実行させることは可能なのでしょうか??

互換性があるハードウェアで同じOSであれば、ほとんどのバイナリは再コンパイル不要です。
再コンパイルで実行できるようになったケースは、ハードウェア(特にCPU)が非互換だったのではないでしょうか?


【raa0121さんの回答を見て追記】

移し方によっては、実行権限が外れてしまい、その状態では実行できなくなってしまうこともあります。

これが正解かも知れません。USBメモリはFAT系のフォーマットが多いので、アクセス権の記録が失われてしまいます。それをlinuxへ戻した時にそのまま実行権がなくなっていると実行できなくなります。
再コンパイルで再度実行権を付与した結果実行できるようになったというシナリオです。
この場合は、chmodで実行権を与えれば実行できるようになると思います。

投稿2016/12/27 03:15

編集2016/12/27 07:03
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/12/27 10:05

再コンパイルなしで、実行できました。 ありがとうございます。 再コンパイルの必要がないのはABIという概念が存在するから という理解で正しいのでしょうか??
Chironian

2016/12/27 10:18

その通りです。 逆にWindowsは他のOSとABIを共通化してない(しようとしていない?)ので、linuxやunixとは非互換と捉えても良いと思います。
strike1217

2016/12/27 10:34

なるほどです! クロスコンパイルした場合というのは非互換CPUの間で実行できるようになるのでしょうか?? それともOSレベルなのでしょうか??
Chironian

2016/12/27 10:50

クロスコンパイルは、対象CPU向けにバイナリを生成するということです。 クロスコンパイルで出力されたバイナリをホスト側で実行することは一般にはできません。
strike1217

2016/12/27 10:53

あ! そうなんですか!! ということは対象CPUを指定してコンパイルするんですね!
strike1217

2016/12/27 10:57

わかりました。 ありがとうございました
guest

0

アプリケーションの動作前提には色々なものがあると思います。

  • プロセッサ
  • OS(のバージョン)
  • OSにプラグイン的に追加されるリソース(言語パックの種類とか)
  • 動的にロードされるシステム標準ライブラリー(のバージョン)
  • 動的にロードされる非標準ライブラリー(の有無やバージョン)

特定の実行可能ファイルが使用している機能のうち、上記のいずれかに互換性がなければ動かないし、全ての互換性があれば動くということになると思います。単純にGUIを使っているかどうかやどの言語でコンパイルしたかで判断できるものではないと思います。

投稿2016/12/26 23:53

編集2016/12/27 00:33
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/12/27 00:26

ありがとうございます
KSwordOfHaste

2016/12/27 10:37

質問者さんがおっしゃっている話は自分が挙げた全ての条件が同じという意味合いだったんですね。違う次元の回答をしてしまったようです。
strike1217

2016/12/27 10:42

大丈夫でござる!! 分かりにくくてすいません。
guest

0

作ったプログラムが、ダイナミックリンクライブラリ(Winなら.dll、Linux なら.so)に依存している場合、
その依存しているファイルが存在しないと、動きません。
確認するには、Linuxであれば ldd というコマンドで確認できます。
Windowsでの確認はVisualStudio がインストール済みならば、dumpbin.exeで行えます。

また、Linuxの場合ですが、ファイルを移したあと、そのファイルに実行権限があるかも確認してください。
移し方によっては、実行権限が外れてしまい、その状態では実行できなくなってしまうこともあります。

投稿2016/12/27 05:15

raa0121

総合スコア190

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/12/27 10:03

移し方で権限が外れてしまうんですか! ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問