2010-10-17 79 views
3

如何獲取C預處理器的系統包含搜索路徑?這是用於解析任意源文件的腳本,需要知道它們#include的頭文件的完整路徑名。讓我們暫時忽略用戶可以用編譯器標誌來改變這個搜索路徑序列。我更喜歡使用在POSIX系統上找到的標準工具的解決方案,所以我的腳本幾乎完全依賴於任何東西。獲取包含路徑cpp搜索

我想:

cpp -v </dev/null | unusually_complex_filter 

但是這顯然沒有考慮在考慮之類的東西$C{,PLUS}_INCLUDE_PATH。要知道#include <vector>的矢量在哪裏,我想我必須知道搜索路徑的精確順序。

+0

這似乎是cpp -v 2010-10-27 03:24:12

+0

這取決於編譯器,因語言而異(最顯着的是C vs C++)。你打算如何處理在makefile中使用CPPFLAGS變量的項目?什麼是你腳本的目的?(http://tinyurl.com/meta-xy) – 2010-11-09 16:27:45

回答

0

標準頭文件不需要作爲包含符合標準的C源程序的常規文件訪問。通常,它們可以作爲文件訪問,但使用許多擴展名。

也許您可以在源文件上運行預處理程序,該程序在源文件上以符合POSIX標準的方式運行,編號爲c99 -E,並使用其輸出。 POSIX沒有定義預處理器的確切輸出,但它通常包含顯示每個實際行的原點的特殊行。

0

像這樣TEST.CPP:

#include <string> 
#include <iostream> 

int main(int, char **) 
{ 
    return 0 
} 

CPP從GCC工具包,您可以撥打:

cpp test.cpp | grep '^#.*' | awk '{print $3}' 

你會得到

"test.cpp" 
"<built-in>" 
"<command-line>" 
"test.cpp" 
"/usr/include/c++/4.4/string" 
"/usr/include/c++/4.4/string" 
"/usr/include/c++/4.4/string" 
"/usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h"  
"/usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h" 
"/usr/include/c++/4.4/x86_64-linux-gnu/bits/os_defines.h" 

,還有更多線。

很明顯你會得到很多「重複」,因爲許多包含文件也包含在其他包含文件中。

0

經過一些chat來獲取上下文,我認爲這個問題只是對cpp解析不同語言的誤解。

我不知道便攜式-x是如何(或者便攜式-v的輸出格式是多少),儘管其他編譯器可能有非常相似的東西(例如,我相信Intel的編譯器在此處的行爲相同),但似乎你只需要告訴你所使用的語言CPP爲它包括它的語言相關的,內部配置的路徑:

$ cpp --version # my cpp is from gcc 
cpp (Ubuntu 4.4.3-4ubuntu5) 4.4.3 
... 
$ cpp -v </dev/null 2>&1 1>/dev/null | sed -nr 's/^ ([^ ]+)$/\1/p' 
/usr/local/include 
/usr/lib/gcc/i486-linux-gnu/4.4.3/include 
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed 
/usr/include/i486-linux-gnu 
/usr/include 
$ cpp -v -x c++ </dev/null 2>&1 1>/dev/null | sed -nr 's/^ ([^ ]+)$/\1/p' 
/usr/include/c++/4.4 
/usr/include/c++/4.4/i486-linux-gnu 
/usr/include/c++/4.4/backward 
/usr/local/include 
/usr/lib/gcc/i486-linux-gnu/4.4.3/include 
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed 
/usr/include/i486-linux-gnu 
/usr/include 

這很好地銜接,當你的腳本需要具體項目包括路徑:

$ mkdir my-include # or else cpp ignores it 
$ cpp -Imy-include -v -x c++ </dev/null 2>&1 1>/dev/null | sed -nr 's/^ ([^ ]+)$/\1/p' 
my-include 
/usr/include/c++/4.4 
/usr/include/c++/4.4/i486-linux-gnu 
/usr/include/c++/4.4/backward 
/usr/local/include 
/usr/lib/gcc/i486-linux-gnu/4.4.3/include 
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed 
/usr/include/i486-linux-gnu 
/usr/include 

退回的訂單是爲了搜索,然而<>包括跳過「」的路徑包括(但「」包括搜索路徑)。在這裏,cpp的輸出確實可以區分兩組路徑,如果需要的話。