2010-10-17 82 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的输出确实可以区分两组路径,如果需要的话。