168

gccを使用して非常に単純なソースファイルをコンパイルする場合、stdioやstdlibなどの標準のインクルードファイルへのパスを指定する必要はありません。

GCCはこれらのファイルを見つける方法をどのように知っていますか?

/usr/include内部にパスが配線されていますか、それとも他のOSコンポーネントからパスを取得しますか?

4

5 に答える 5

241

gcc/で使用されるデフォルトのパスとその優先順位を把握するにg++は、次のコマンドの出力を調べる必要があります。

  1. Cの場合:
    gcc -xc -E -v -
  1. C ++の場合:
    gcc -xc++ -E -v -

クレジットはQtCreatorチームに送られます。

于 2011-07-12T15:01:01.053 に答える
50

出力が短いコマンドがあります。これにより、単一のスペースから始めて、行からインクルードパスを自動的に切り取ることができます。

$ echo | gcc -Wp,-v -x c++ - -fsyntax-only
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/x86_64-redhat-linux
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/backward
 /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include
 /usr/local/include
 /usr/include
End of search list.

クレジットはlibc++のフロントページに送られます。

于 2013-11-07T15:34:26.380 に答える
2

C++を検討するためのIhorKaharlichenkoの回答と、出力のコンパクトさに関するabyss.7の回答には同意しますが、入力処理はコマンドラインパラメーターとマクロに依存するため、gccのマルチアーチバージョンではまだ不完全です。

例:

echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -specs=nano.specs -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfloat-abi=soft -x c++ -E -Wp,-v\ - -fsyntax-only収量

⋮
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../arm-none-eabi/include/newlib-nano                                                                                                              
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi/thumb/v7e-m/nofp                                         
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
 /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  
⋮

一方echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -x c++ -E -Wp,-v - -fsyntax-only

⋮
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi                                                          
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  
⋮

前者の呼び出しはnewlib(出力の1行目と3行目を参照)を利用し、後者は標準のインクルードを使用します。リストの最後にある一般的なファイルは、の使用例ですinclude_next

結論:インクルードディレクトリを印刷するときは、常にすべてのマクロコンパイラオプションを考慮してください。

于 2019-11-27T10:34:17.937 に答える
0

次のコマンドを実行して、デフォルトの検索パスを一覧表示します。

$(gcc -print-prog-name=cc1) -v
于 2019-06-18T08:17:26.090 に答える
0

他の答えを要約すると:

C ++の場合:

c++ -xc++ /dev/null -E -Wp,-v 2>&1 | sed -n 's,^ ,,p'

Cの場合:

cc -xc /dev/null -E -Wp,-v 2>&1 | sed -n 's,^ ,,p'

于 2022-01-07T23:40:50.643 に答える