26

「作業ディレクトリ」には、互いに多くの *.cpp および *.h ファイルが#includeあり、サブディレクトリからのファイルがあります。

例えば:

#include "first.h"
#include "second.h"
#include "dir1/third.h"
#include "dir2/fourth.h"

自分のディレクトリ (「作業」ディレクトリとは異なります) に、「作業」ディレクトリのファイルの 1 つを含む新しい *.cpp および *.h ファイルを作成したいと考えています。例えば:

#include "/root/workingdirectory/first.h"

しかし、うまくいきません。「first.h」には「second.h」が含まれている可能性があり、「second.h」は私のディレクトリにありません。インクルードされたファイルを現在ではなく作業ディレクトリで検索する必要があることをコンパイラに伝える方法はあります/root/workingdirectory/か?

さらに複雑にするために、作業ディレクトリにはありませんdir1dir2にあり/root/workingdirectory2/ます。2 つ目の質問は、サブディレクトリが別の場所にあることをコンパイラに知らせることで、この問題を解決できるかどうかです。

また、開発に環境を使用せず、コマンド ラインから ( を使用してg++) コンパイルすることも追加する必要があります。

4

4 に答える 4

15

すでにお話ししたように、マニュアル、特にこの章、さらに具体的にはここを読むと便利です。

具体的には、

g++ -I/root/workingdirectory -I/root/workingdirectory2

ここ#includeで次のように説明されているディレクティブ構文に関するドキュメントにも注意してください。

2.1構文を含める

ユーザーヘッダーファイルとシステムヘッダーファイルの両方が、前処理ディレクティブを使用してインクルードされます#include。2つのバリエーションがあります。

#include <file>

このバリアントは、システムヘッダーファイルに使用されます。システムディレクトリの標準リストでfileという名前のファイルを検索します。-Iオプションを使用して、このリストの前にディレクトリを追加できます(呼び出しを参照)。

#include "file"

このバリアントは、独自のプログラムのヘッダーファイルに使用されます。最初に現在のファイルを含むディレクトリでfileという名前のファイルを検索し、次にquoteディレクトリで検索し、次に。に使用されるのと同じディレクトリを検索します<file>。-iquoteオプションを使用すると、quoteディレクトリのリストの前にディレクトリを追加できます。の引数は #include、引用符または山かっこで区切られているかどうかに関係なく、コメントが認識されず、マクロ名が展開されないという点で文字列定数のように動作します。したがって、#include <x/*y>x /*yという名前のシステムヘッダーファイルをインクルードすることを指定します。

ただし、ファイル内で円記号が発生した場合、それらはエスケープ文字ではなく、通常のテキスト文字と見なされます。Cの文字列定数に適切な文字エスケープシーケンスはどれも処理されません。したがって、#include "x\n\\y"3つの円記号を含むファイル名を指定します。(一部のシステム\はパス名の区切り文字として解釈されます。これらもすべて/同じように解釈されます。使用するのが最も移植性が高い/です。)

ファイル名の後の行に(コメント以外の)何かがある場合はエラーになります。

だから例えば

#include "first.h"

このディレクティブを含む.cppファイルと同じディレクトリの検索を開始します(または、このディレクトリからの相対パスを使用します)。

インクルードパス(で指定-I)を使用する場合は、

#include <dir1/third.h>

Usual practice is to use the #include "local.h" form for headers inside a library/package/module (however you've chosen to organize that), and the #include <external.h> form for headers from external/3rd-party or system libraries.

于 2013-03-18T13:35:37.600 に答える
13

ファインマニュアルを読む

誰もが読めるようにそこにあります。何を使用するかを選択することもできます(最初のものを使用します):

-Idir

ヘッダー ファイルを検索するディレクトリのリストの先頭にディレクトリ dir を追加します。これらのディレクトリはシステム ヘッダー ファイル ディレクトリの前に検索されるため、これを使用してシステム ヘッダー ファイルを上書きし、独自のバージョンに置き換えることができます。ただし、このオプションを使用して、ベンダー提供のシステム ヘッダー ファイルを含むディレクトリを追加しないでください (そのために使用します-isystem)。複数の-Iオプションを使用する場合、ディレクトリは左から右の順序でスキャンされます。標準のシステム ディレクトリが後に続きます。

標準のシステム インクルード ディレクトリ、または で指定されたディレクトリ-isystemが で指定されて-Iいる場合、-Iオプションは無視されます。ディレクトリは引き続き検索されますが、システム インクルード チェーン内の通常の位置にあるシステム ディレクトリとして検索されます。これは、バグのあるシステム ヘッダーを修正する GCC の手順とinclude_nextディレクティブの順序が誤って変更されないようにするためです。システムディレクトリの検索順序を本当に変更する必要がある場合は、-nostdincand/or-isystemオプションを使用してください。

-iquotedir

の場合のみ、ヘッダー ファイルを検索するディレクトリのリストの先頭にディレクトリ dir を追加します#include "file"。それらは検索されませ#include <file>-I

于 2013-03-18T13:32:23.043 に答える
3

gccの場合、ヘッダーインクルード-Iのオプションです。.cppファイルの場合、gccコマンドの引数として表示される必要があります。

于 2013-03-18T13:30:00.713 に答える