2013-03-19 70 views
0

讓我們假設在first.h我們#include "aaa/second.h"並在aaa/second.h我們有#include "bbb/third.h"。我認爲,如果「third.h」不在「aaa/bbb」中,編譯器會在「默認設置」中發出抱怨。是否可以強制編譯器使用「working」目錄的名稱來構建包含所有全名?

是否有可能以這種方式改變這種行爲: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。我在兩個不同的終端做。它看起來像在第一個終端工作目錄用來構造全名,在第二個終端,情況並非如此。我幾乎可以肯定,它是由於環境變量而發生的,但我不知道哪些變量。所以,我的問題是,在更大程度上,什麼樣的環境變量可以強制編譯器使用工作目錄來構造全名。

EDIT 2

在我TEST.CPP文件I包括 「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子目錄中)。

在另一終端中,相同的編譯命令,在同一目錄中不會引起任何問題。其原因顯然在於環境變量的價值。

+0

你錯過任何引號或尖括號在你的第二個'#include'。 – 2013-03-19 10:17:12

+0

@Kerrek SB,謝謝。我需要引號。 – Roman 2013-03-19 10:20:07

回答

3

是。確切的機制取決於編譯器,但其短而長的一點是,您需要配置編譯器以將項目路徑包含在搜索路徑中。 GCC和鏗鏘的是威盛的-I命令行標誌(-I path/of/first.cpp)來完成。這種配置通常在項目設置中完成(如果你使用IDE),Makefile或類似的。

由於您在談論環境變量:傳遞給g++c++編譯器的標誌由CXXFLAGSCFLAGS變量控制。

+0

我以爲引用應該用於'/ home/bucky/aaa/second.h'中'_I/home/bucky'中的自己的頭文件'aaa/second.h',用於指示編譯器的位置看。尖括號只用於'/ usr/include/time.h'中的系統頭文件'time.h'。實際上,大多數編譯器不區分<>和「」 – DanS 2013-03-19 10:24:48

+0

@Dan否,編譯器*會區分它們。不同的是Kerrek寫的,但是你可以(並且在我的書中,*應該*)在你不使用時使用尖括號包含相對於本地目錄。這就是發生在這裏的情況:您正在使用包含相對於(配置)的搜索路徑。尖括號在這裏是正確和適當的。它們絕對*不限於系統頭文件。 – 2013-03-19 10:27:47

+0

@Konrad Rudolph,我對最初的問題進行了兩次編輯,以澄清我的問題到底是什麼。簡而言之,我認爲可以在不使用-I選項的情況下更改編譯器的行爲,也不用「<>」替換「」。 – Roman 2013-03-19 10:34:41

3

您應該建立包括全球範圍內的項目路徑。在你的例子中,你會通過一些選項如-I /home/bucky到你的編譯器(如果它是GCC或Clang)。 MSVC有類似的選項。

(所有的#includes被搜索相對於包括路徑。<...>"..."之間的區別是,後者也搜索當前目錄。)

+0

在我的代碼中我只有'「...」'。我用'g ++'編譯。我沒有使用'-I'選項。在一個終端中,編譯器似乎使用工作目錄的名稱來構造所有的全名,而在另一個終端中則不是這樣。它發生是因爲環境變量,但我不知道哪些。 – Roman 2013-03-19 10:27:47

+0

我對最初的問題進行了兩次編輯,以澄清我的問題到底是什麼。簡而言之,我認爲可以在不使用-I選項的情況下更改編譯器的行爲,也不用「<>」替換「」。 – Roman 2013-03-19 10:35:07

相關問題