2017-05-08 26 views
-2

已經有許多選項列出瞭如何向C++編譯器添加路徑,以便#include < ...>命令在這些路徑上工作。但是,假設我有一個文件(不是整個項目),並且我想僅爲此文件添加一個包含路徑。我想通過cpp文件(例如,作爲第一行)內的一行代碼來執行此操作。這怎麼可能?爲什麼?因爲我需要從另一個目錄中包含一些頭文件,而這又依賴於同一目錄中的其他頭文件(並且由於這條路徑沒有添加到包括列表)。設置C++包括通過程序代碼行的路徑

例如: 假設我想包括file_a.h目錄 .../include/extra

我能做到這一點通過

#include <extra/file_a.h> 

但是,如果,例如,我沒有多餘的目錄直接作爲include的子目錄,或者file_a想要包含其他某個地方的其他文件(甚至可以是/extra,但它不是包含的子目錄),那麼我會遇到麻煩,因爲那麼tra目錄/依賴關係變得困難。

我認爲通過編譯器改變這些目錄是一個壞習慣,所以我認爲更好的解決方案是將它集成到程序中,所以無論我使用哪種編譯器,它都可以工作,無需考慮之後,一旦指定,我必須添加哪些目錄。

+0

如果您可以更改包含的文件,可以將其包含從''更改爲'「file.h」'http://stackoverflow.com/questions/21593/what-is-the-difference -between-include-filename-and-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)即G。使用eclipse + GCC,右鍵單擊文件,選擇「屬性」 - > C/C++ Build - > Tool Settings - > GCC C++ Compiler - > Includes。

或者你也可以使用make文件(實際上,標準設置中的eclipse會自動爲你生成一個...),它可以讓你爲每個文件單獨設置編譯器選項 - 直接由你自己編寫或者由一些其他工具,如cmake