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

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

ただいまの
回答率

90.03%

なぜ実行ファイルが得られるのか理由がわかりません。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 861

carnage0216

score 131

<環境>
Windows10 64bit
MinGW
GCC

mingwにパスを通せたのですが、そのあと好奇心でCドライブのディレクトリに「自作MinGW」というファイルを作ってユーザー環境変数の新規変数に「自作MinGW」、値「C:\自作MinGW」を書き入れ
システム環境変数のPATHに「C:\自作MinGW」を書いた後、
コマンドプロンプトの方でコマンド cd C:\自作MinGW から
載せましたソースコード

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


/* main */
int main(void) {
    double x = 2.0, y;
    int n = 4;

    y = scalbn(x, n);
    printf("scalbn(%.2f, %d) = %.2f\n", x, n, y);

    return EXIT_SUCCESS;
}


をコンパイルしたところ実行ファイルが得られました。
正直なところなぜ実行ファイルが得られたのかわかりません。
C:\自作MinGWのディレクトリにはヘッダファイルもなにも入っていません。あるのはソースコードだけです。
なぜ、ユーザー環境変数の新規変数に「自作MinGW」、値「C:\自作MinGW」を書き入れ
システム環境変数のPATHに「C:\自作MinGW」を書いただけでコマンドプロンプトで
C:\自作MinGW>へディレクトリを移りコマンド gcc C:\自作MinGW\std.cppから実行ファイルが得られるのか理由がわかりません。
前にも書きましたがC:\自作MinGWのディレクトリにはソースコードのみでヘッダファイルもなにも入っていないのに、ヘッダファイルが見つからないなどのエラーが出力されず実行ファイルが得られた理由がわかりません。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+4

疑問が複数あるようなので、ひとつずつ分解しましょう。

  1. ユーザー環境変数の新規変数に「自作MinGW」、値「C:\自作MinGW」を書き入れ
    こちらについては、全くの無意味です。gcc、ならびに自作exeの動作に何らの影響も与えていません。
  2. システム環境変数のPATHに「C:\自作MinGW」を書いた
    これを行うことで、自作exeをパス指定なしで実行できるようになります。
  3. ソースコード(中略)をコンパイルしたところ実行ファイルが得られました。
    ソースコード内で、システムのヘッダのみ参照しているため、ヘッダパスなどを明示しなくてもヘッダファイルを見つけ、インクルードに成功しています。
  4. C:\自作MinGWのディレクトリにはソースコードのみでヘッダファイルもなにも入っていないのに、ヘッダファイルが見つからないなどのエラーが出力されず実行ファイルが得られた理由がわかりません。
    ヘッダファイルは、コンパイル時(つまりexe作成時)のみ必要となるものなので、exe実行時は必要ありません。

ほか、答えたりないところはありますでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/26 17:40

    整理してくださりありがとうございます。
    2に関してなのですが、システム環境変数のPATHに「C:\自作MinGW」を書いただけでヘッダファイルを参照してくれているとのことですが、自作MinGWのディレクトリにあるソースコードが参照しているヘッダファイルはMinGWのディレクトリにあるヘッダファイルでしょうか?
    そのヘッダファイルを参照したため、自作MinGWに移ってもソースコードがコンパイルできたのですかね。
    だとしても、自作MinGWとMinGWが環境変数でパスを通してだけで、自作MinGWがMinGWのヘッダファイルが参照できる原理がよくわかりません。

    キャンセル

  • 2018/03/26 17:45

    誤解があります。「システム環境変数のPATHに「C:\自作MinGW」を書いただけでヘッダファイルを参照してくれている」とは、私は一言も言っていません。理由は4番に記載した内容そのものです。

    > 自作MinGWのディレクトリにあるソースコードが参照しているヘッダファイルはMinGWのディレクトリにあるヘッダファイルでしょうか?

    その通りです。

    > 自作MinGWがMinGWのヘッダファイルが参照できる原理がよくわかりません。

    これは、GCCがデフォルトで参照するヘッダファイルパスを持っているからです。
    ユーザがいちいちstdio.hがどこにあるかを気にしてコンパイルしなくてすむような便利機能とでもお考えください。

    キャンセル

  • 2018/03/26 18:33

    うまく理解できてなくてごめんなさい。
    なるほど4のおかげでmingwにあるヘッダファイルが使えるわけでしたか。
    確かに便利です。

    キャンセル

  • 2018/03/26 18:37

    どうもありがとうございます。

    キャンセル

+3

mingwにパスを通せたのですが

これ。
mingwにパスが通っているから。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/26 17:40

    どうもありがとうございます。

    キャンセル

  • 2018/03/26 17:58

    キャンセル

  • 2018/03/26 18:34

    asmさん、どうもありがとうございます。

    キャンセル

+1

環境変数はPATHだけではありません。あなたの興味はPATHにしかないかも知れませんが、だからといってPATH以外を無視して勝手にPATHだけの話のつもりになっていいものでもないでしょう。

で、そもそもPATHってなんでしたっけ。
コマンド名を与えられたシェルが、PATHに書いてあるディレクトリ群をコマンド名探索の候補とするもの。それ以上でも以下でもないです。「ソース」も「ヘッダ」も関係ありません。

PATHに書いてある順にディレクトリを探索し、与えられたコマンド名で実行可能なものがないか順次探していって、最初に見つかったものを実行します。自作なんちゃらにgccがなかったですか。ではPATHに書いてある次のディレクトリを探しましょう。途中で他のディレクトリを探して見つからなかった、としても次を探します。たどり着いたC:\MinGW\binにgcc.exeがありましたか。ではそれを実行します。PATHの役割はここまで。gcc.exeは、実行ファイルの位置を基準に標準のヘッダやライブラリを探索してよろしくコンパイルを実行します。ここにはPATHは絡みません。

以上、この仕組みになにか疑問な点がありますか?

勝手に違う事柄を関連付けないこと。規則・事実だけを、認識して下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

GCCはヘッダファイルの場所を知ってます。それだけ。
オプションで追加のヘッダファイルディレクトリを指定することもできますが、gccはgccをインストールしたときに(インストーラが)設定した「デフォルトの、ヘッダファイルを置いてあるディレクトリ」も見に行きます。

なお、PATHはgcc.exeを探すのに使う環境変数であってヘッダファイルとは無関係、というのは他の方が解説済みですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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