2017-05-08 4 views
-2

C++コンパイラにパスを追加する方法については、すでに多くのオプションがありますので、#include < ...>コマンドがこれらのパスで機​​能します。しかし、私は1つのファイル(プロジェクト全体ではない)を持っていると仮定し、このファイルだけのインクルードパスを追加したいとします。私はこれをのcppファイル(一番最初の行)のコード行で行いたいと思います。これはどのように可能ですか?どうして?同じディレクトリ内の他のヘッダーファイルにも依存する別のディレクトリのヘッダーファイルをインクルードする必要があるため(このパスが追加されていないため、これらの他のファイルが見つかりませんでした。インクルードリスト)。例えばプログラムコード行を使用してC++インクルードパスを設定する

: 例えば、私は余分なディレクトリを持っていない、場合、私は、しかし

#include <extra/file_a.h> 

を経由していることを行うことができますのは、私はディレクトリ .../include/extrafile_a.hを含める

を想定してみましょうincludeのサブディレクトリとして直接、またはfile_aは他のどこかのファイル(例えば/extraでも可能ですが、includeのサブディレクトリではありません)を追加したい場合は、traディレクトリ/依存関係の把握が難しくなります。

コンパイラでこれらのディレクトリを変更するのは悪い習慣だと思ったので、それをプログラムに統合する方がよいと思ったので、どのコンパイラを使用していても、後で、一度指定されると、私が追加しなければならないディレクトリ。私の理解パー

+0

含まれているファイルを変更することができる場合は、それらのインクルードを ''から' 'file.h" 'に変更することができます。http://stackoverflow.com/questions/21593/what-is-the-difference -with-include-filenameとインクルードファイル名 – Lanting

+0

実行時に実行されるコード行を考えていない可能性があるので、「コード行」とはどういう意味ですか? #include文の中でパスを使用していないのはなぜですか? 「XY問題」のコメントを受け取る危険性がある場合は、達成したいことについてもっと詳しく記述してください。コードとヘッダーの例を示し、目的の効果を説明してください。簡単に[mcve]を試してみてください。 – Yunnosch

+0

これは鶏と卵の問題のようなものです;-) –

答えて

1

あなたがやった:

#include <absolute/path/to/header/header.h 

または

#include <relative/path/to/header/header.h 

しかし、いくつかの他には、このheader.hには含まれています。

#include <header_1.h> 
#include <header_2.h> 
[...] 
#include <header_n.h> 

これらの他のヘッダーは、相対パスまたは絶対パスを持たないため、コンパイラはそれらを見つける方法を知りません。あなたは(を使用)を使用することができ、これを解決するために

-Iコンパイラオプション:

-I dirの

は、中にヘッダファイルを検索するディレクトリのリストにディレクトリdirを追加します。前処理。 [...]

重点鉱山

つまり、あなたのファイルで

#include <header.h> 

を使用して

gcc ... -I/path/to/headers ... 
+1

あなたはOPが何を望んでいるかを推測しています。それは勇敢です。しかし、あなたは、OPの状態(とおそらく信じているもの)が "cppファイル内のコード行を介して"必要とするものと矛盾しているようです。だから、あなたはOPが明示的に述べられているもの以外の何かを望んでいると推測している。私は、あなたがなぜOPが(太字でも)質問に言ったことに反対する理由を説明することをお勧めします。しかし、OPにアプローチを変えるよう説得することは、インタラクティブに成功する可能性が高い。そうであるように、答えは質問に対する答えではないように見えます。 – Yunnosch

+0

@Yunnoschまあ、そうかもしれない。我々は見るでしょう。 OPの問題が異なり、私の推測が間違っている場合、私は答えを削除します:問題ありません。 – LPs

+0

@Yinyue私の解決策(コンパイラベース)はあなたが従うことができる唯一のものです。それ以外の場合は、プロジェクトディレクトリ内のすべてのヘッダーを移動し、すべての '#include'ディレクティブをプロジェクトツリーに合わせて変更する必要があります。 – LPs

1

を使用して、それをコンパイルすることができますパスはどこコンパイラに伝える含めます実際に他のファイルに含めるファイルを見つけます。これは、(通常)この答えで説明されているLPのようなコンパイラオプションによって制御されます。

今...

C++標準では、C++ソースファイル内からこれを実行するために、任意の機能を提供していないと、私はそうすることが可能になる任意のベンダーのいずれかのコンパイラの拡張機能なので、運が悪いのどちらか知りませんあなたが使用しているIDEに応じて(おそらくです...)、ファイルのインクルードパスを個別に追加することができます(これが許されない場合は奇妙なIDEになります) e。 g。 eclipse + GCCで、ファイルを右クリックし、 "Properties" - > C/C++ Build - > Tool Settings - > GCC C++ Compiler - > Includesを選択します。

代わりに、makeファイルを代わりに使用することもできます(実際には、標準設定ではEclipseが自動的に生成します...)。これにより、各ファイルのコンパイラオプションを個別に設定することができます。 cmakeのようなこれを助けるいくつかの他のツール。

関連する問題