それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

gccのインクルードパスについて調べたこと

gccのinclude パスについて調べたい。いっつも何処から読んでるのかよくわからない。
小手先で調べた。

ソースをコンパイルして調べてみる

takuya@air:~$ cat  test.c
#include <stdio.h>

int main(){
     return 0;
}
gcc -v test.c

と-v オプションをつけると、詳しい状況が表示されます。これをつかってインクルードパスについて調べみた。

-v で調べてみたら・・

takuya@air:~$ gcc -v  test.c
Using built-in specs.
Target: i686-apple-darwin11
(略
#include "..." search starts here:
#include <...> search starts here:
 /usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin11/4.2.1/include
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
(略

このうち、include と書かれたディレクトリには ヘッダーファイルがある。

 /usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin11/4.2.1/include
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/include
 /usr/include

stdio.h などは /usr/include にある。

ディレクトリを追加したらどうなるか

オプション -I をつけて、インクルードディレクトリを追加してみたら?

takuya@air:~$ gcc -v test.c  -I ./Sites/Using built-in specs.
Target: i686-apple-darwin11

(中略)
#include "..." search starts here:

#include <...> search starts here:

 ./Sites/
 /usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin11/4.2.1/include
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)

ちゃんと、追加されていますね。

追加の追加の場合はどうなるのか

追加オプションを続けて、更に追加してみたら?

takuya@air:~$ gcc -v test.c  -I ./Sites/ -I ./Documents/ -I ../Guest
(略
#include "..." search starts here:
#include <...> search starts here:
 ./Sites/
 ./Documents/
 ../Guest
 /usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin11/4.2.1/include
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
GNU C version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00) (i686-apple-darwin11)
     compiled by GNU C version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00).
(略

書かれた順番で追加されていますね。後に書いたほうが後ろになりました。

ところでmanをみたら

gccのmanをみたら--print-search-dirsで見られそうだった

       --print-search-dirs
           Print the name of the configured installation directory and a list of program and library
           directories gcc will search---and don't do anything else.

           This is useful when gcc prints the error message installation problem, cannot exec cpp0: No such
           file or directory.  To resolve this you either need to put cpp0 and the other compiler components
           where gcc expects to find them, or you can set the environment variabl

こっちは、libとかコンパイル済みのライブラリへの検索パスですね

Macのgccで試した見た。

takuya@air:~$ gcc --print-search-dirs | ruby -ne 'puts $_.split(/:|=/).select{|e| e =~/^\//}.map{|e| File.expand_path(e) }' | sort
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/i686-apple-darwin11/bin/
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/i686-apple-darwin11/bin/i686-apple-darwin11/4.2.1
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/i686-apple-darwin11/lib
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/i686-apple-darwin11/lib/i686-apple-darwin11/4.2.1
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/i686-apple-darwin11/lib/i686-apple-darwin11/4.2.1/x86_64
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/i686-apple-darwin11/lib/x86_64
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/x86_64
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/i686-apple-darwin11/4.2.1
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/i686-apple-darwin11/4.2.1/x86_64
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/x86_64
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/libexec/gcc/i686-apple-darwin11
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/libexec/gcc/i686-apple-darwin11/4.2.1
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/libexec/gcc/i686-apple-darwin11/4.2.1
/lib
/lib/i686-apple-darwin11/4.2.1
/lib/i686-apple-darwin11/4.2.1/x86_64
/lib/x86_64
/usr/lib
/usr/lib/gcc/i686-apple-darwin11
/usr/lib/gcc/i686-apple-darwin11/4.2.1
/usr/lib/gcc/i686-apple-darwin11/4.2.1
/usr/lib/gcc/i686-apple-darwin11/4.2.1/x86_64
/usr/lib/i686-apple-darwin11/4.2.1
/usr/lib/i686-apple-darwin11/4.2.1/x86_64
/usr/lib/x86_64
/usr/libexec/gcc/i686-apple-darwin11
/usr/libexec/gcc/i686-apple-darwin11/4.2.1
/usr/llvm-gcc-4.2/i686-apple-darwin11/bin
/usr/llvm-gcc-4.2/i686-apple-darwin11/bin/i686-apple-darwin11/4.2.1
/usr/llvm-gcc-4.2/i686-apple-darwin11/lib
/usr/llvm-gcc-4.2/i686-apple-darwin11/lib/i686-apple-darwin11/4.2.1
/usr/llvm-gcc-4.2/i686-apple-darwin11/lib/i686-apple-darwin11/4.2.1/x86_64
/usr/llvm-gcc-4.2/i686-apple-darwin11/lib/x86_64
/usr/llvm-gcc-4.2/lib
/usr/llvm-gcc-4.2/lib/gcc
/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1
/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/x86_64
/usr/llvm-gcc-4.2/lib/gcc/x86_64
/usr/llvm-gcc-4.2/lib/i686-apple-darwin11/4.2.1
/usr/llvm-gcc-4.2/lib/i686-apple-darwin11/4.2.1/x86_64
/usr/llvm-gcc-4.2/lib/x86_64
/usr/llvm-gcc-4.2/libexec/gcc
/usr/llvm-gcc-4.2/libexec/gcc/i686-apple-darwin11/4.2.1

Linuxでも試してみた

takuya@atom:~$ gcc --print-search-dirs | ruby -ne 'puts $_.split(/:|=/).select{|e| e =~/^\//}.map{|e| File.expand_path(e) }' | sort
/lib
/lib
/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu/4.6
/usr/lib
/usr/lib
/usr/lib
/usr/lib/
/usr/lib/gcc/x86_64-linux-gnu
/usr/lib/gcc/x86_64-linux-gnu
/usr/lib/gcc/x86_64-linux-gnu/4.6
/usr/lib/gcc/x86_64-linux-gnu/4.6
/usr/lib/gcc/x86_64-linux-gnu/4.6
/usr/lib/gcc/x86_64-linux-gnu/4.6
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/4.6
/usr/lib/x86_64-linux-gnu/4.6
/usr/x86_64-linux-gnu/bin/
/usr/x86_64-linux-gnu/bin/x86_64-linux-gnu
/usr/x86_64-linux-gnu/bin/x86_64-linux-gnu/4.6
/usr/x86_64-linux-gnu/lib
/usr/x86_64-linux-gnu/lib
/usr/x86_64-linux-gnu/lib/x86_64-linux-gnu
/usr/x86_64-linux-gnu/lib/x86_64-linux-gnu/4.6

どうも-print-search-dirsは、ライブラリの検索パスですね。