0

first.h私たちが持っていると私たちが持っている#include "aaa/second.h"と仮定しましょaaa/second.h#include "bbb/third.h"。「デフォルト設定」では、「third.h」が「aaa/bbb」にない場合にコンパイラが文句を言うと思います。

が配置されているディレクトリをfirst.cpp使用してすべてのフルネームを作成するように、この動作を変更することはできますか?

たとえば、「first.h」が「/ home / bucky /」にある場合、#include "bbb/third.h"(「aaa / second.h」から)はとして/home/bucky/bbb/third.hではなく、として解釈する必要があります/home/bucky/aaa/bbb/third.h

編集

ソースコード全体を変更することはできません。コードでは、山括弧の代わりに引用符が使用されています。

g++ -std=c++0x name.cpp -o nameコマンドラインでを使用してコンパイルします。私は2つの異なる端末でそれを行います。最初の端末では作業ディレクトリがフルネームの作成に使用されているように見えますが、2番目の端末ではそうではありません。私はそれが環境変数のために起こることをほぼ確信していますが、どれがどれかはわかりません。ですから、私の質問は、大体において、どの環境変数がコンパイラに作業ディレクトリを使用してフルネームを構築させることができるかということです。

編集2

test.cppファイルに「first.h」を含めます。この包含は問題を引き起こしません(コンパイラは「first.h」を参照)。「first.h」ファイルには「ppp/second.h」が含まれています。また、問題は発生しません。しかし、「ppp/second.h」には「ppp/third.h」が含まれており、これが問題が発生する場所です。問題の原因は、「second.h」がsecond.hが置かれているディレクトリの「ppp」サブディレクトリで「third.h」を見つけようとするためだと思います。つまり、second.hは「ppp / ppp」サブディレクトリでthird.hを見つけようとします(second.hはpppサブディレクトリにあるため)。

別の端末では、同じディレクトリにある同じコンパイルコマンドで問題は発生しません。その理由は、明らかに環境変動の価値にあります。

4

2 に答える 2

3

プロジェクトのインクルード パスをグローバルに設定する必要があります。あなたの例では-I /home/bucky、コンパイラのようなオプションを渡します (GCC または Clang の場合)。MSVC には類似のオプションがあります。

<...>(すべての #include は、インクルード パスに関連して検索されます。との違い"..."は、後者は現在のディレクトリも検索することです。)

于 2013-03-19T10:16:30.640 に答える
3

はい。正確なメカニズムはコンパイラによって異なりますが、要するに、検索パスにプロジェクト パスを含めるようにコンパイラを構成する必要があるということです。-Iコマンドラインフラグ( )を介して行われるGCCおよびclangの場合-I path/of/first.cpp。この構成は通常、プロジェクト設定 (IDE で作業している場合)、Makefile などで行います。

環境変数について話しているので、g++andc++コンパイラに渡されるフラグはCXXFLAGSandCFLAGS変数によって制御されます。

于 2013-03-19T10:16:56.227 に答える