したがって、次のことを行うと:
#include <stdio.h>
versus
#include "myFile.h"
コンパイラ(私の場合はGCC)は、stdio.h(およびオブジェクトファイル)がハードドライブのどこにあるかを知っています。私からの対話なしにファイルを利用するだけです。
私と思うUbuntu Linuxマシンでは、ファイルは/usr/include/
に保存されます。 これらのファイルを探す場所をコンパイラはどのように知るのですか?これは設定可能ですか、これは単に予想されるデフォルトですか?この構成はどこにありますか?
これらのインクルードファイルについて質問しているので、ファイルのソースは何ですか?これはLinuxコミュニティでは曖昧かもしれませんが、だれがこれらを管理しますか? Windowsコンパイラに同じファイルを提供および管理するのは誰ですか。
私はいつも彼らがコンパイラに来るという印象を受けていましたが、それは仮定でした...
こちらをご覧ください: 検索パス
概要:
#include <stdio.h>
インクルードファイルが括弧内にある場合、プリプロセッサは最初に-Iフラグで指定されたパスを検索します。次に、標準のインクルードパスを検索します(上記のリンクを参照し、-vフラグを使用してシステムでテストします)。
#include "myFile.h"
インクルードファイルが引用符で囲まれている場合、プリプロセッサはまず現在のディレクトリを検索し、次に-iquoteで指定されたパスを検索し、次に-Iパス、次に標準パス。
-nostdincは、プリプロセッサが標準パスをまったく検索しないようにするために使用できます。
環境変数 は、検索パスを追加するためにも使用できます。
-vフラグを使用してコンパイルすると、使用されている検索パスを確認できます。
gccは、他の多くのプログラムを呼び出してその職務を遂行する、リッチで複雑な「オーケストレーション」プログラムです。システム上で#include "goo"
と#include <zap>
が検索する場所を確認する特定の目的のために、以下をお勧めします。
$ touch a.c
$ gcc -v -E a.c
...
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i686-Apple-darwin9/4.0.1/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
# 1 "a.c"
これは、含まれるファイルの検索リストを表示する1つの方法です。#include "..."
は表示されるが#include <...>
は表示されないディレクトリ(存在する場合)を含みます。私が表示しているこの特定のリストは、実際にはMac OS X(別名Darwin)にありますが、私が推奨するコマンドは検索リストを表示します(また、ここで...
に置き換えた興味深い構成の詳細;-) gccが正常に実行されるシステムで。
カールは検索パスの質問に答えましたが、「ファイルのソース」に関する限り、注意すべきことは、libfoo
パッケージをインストールして、それを使用して何らかの開発を行いたい場合です(つまり、そのヘッダーを使用します)、libfoo-dev
もインストールする必要があります。あなたが見たように、標準ライブラリのヘッダーファイルはすでに/usr/include
にあります。
多くのヘッダーを持つライブラリは、/usr/include/openssl
などのサブディレクトリにインストールすることに注意してください。これらのいずれかを含めるには、次のように、/usr/include
部分なしでパスを指定します。
#include <openssl/aes.h>
Gccの\#include
ファイルは/usr/include
に保存されます。 g ++の標準インクルードファイルは、/usr/include/c++
に保存されます。