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

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

ただいまの
回答率

90.51%

  • C

    4527questions

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

  • Linux

    4436questions

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

  • Windows

    1707questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,227

strike1217

score 568

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

こんにちは。

とある環境で一度コンパイルしたものを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 19:05

    再コンパイルなしで、実行できました。
    ありがとうございます。

    再コンパイルの必要がないのはABIという概念が存在するから
    という理解で正しいのでしょうか??

    キャンセル

  • 2016/12/27 19:18

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

    キャンセル

  • 2016/12/27 19:34

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

    キャンセル

  • 2016/12/27 19:50

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

    キャンセル

  • 2016/12/27 19:53

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

    キャンセル

  • 2016/12/27 19:55

    ですね。

    キャンセル

  • 2016/12/27 19:57

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

    キャンセル

+2

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/27 09:26

    ありがとうございます

    キャンセル

  • 2016/12/27 19:37

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

    キャンセル

  • 2016/12/27 19:42

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/27 19:03

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

    キャンセル

同じタグがついた質問を見る

  • C

    4527questions

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

  • Linux

    4436questions

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

  • Windows

    1707questions

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