获取包含路径cpp搜索

时间:2010-10-17 03:37:16

标签: preprocessor posix c-preprocessor

如何获得系统包含C预处理器的搜索路径?这是一个解析任意源文件的脚本,需要知道#include标头的完整路径名。让我们暂时忽略用户可以用编译器标志改变这个搜索路径序列。我更喜欢使用POSIX系统上的标准工具的解决方案,所以我的脚本几乎没有任何依赖。

我试过了:

cpp -v </dev/null | unusually_complex_filter

但这显然没有考虑像$C{,PLUS}_INCLUDE_PATH这样的事情。要知道#include <vector>的向量在哪里,我想我必须按照它们的精确顺序知道搜索路径。

3 个答案:

答案 0 :(得分:0)

标准标头不需要作为包含符合标准的C源的常规文件访问。通常,它们可以作为文件访问,但使用许多扩展名。

也许您可以在源文件上运行预处理器,它可以以符合POSIX的方式访问c99 -E,并使用其输出。 POSIX没有定义预处理器的确切输出,但它通常包含显示每条实际行的原点的特殊行。

答案 1 :(得分:0)

使用test.cpp,如下所示:

#include <string>
#include <iostream>

int main(int, char **)
{
  return 0
}
来自gcc工具包的

cpp ,您可以致电:

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"

还有更多行。

你显然会得到很多“重复”,因为其他包含文件也包含了很多包含文件。

答案 2 :(得分:0)

在获得上下文的chat之后,我认为这个问题只是对cpp解析不同语言的误解。

我不知道便携式-x是什么(或者如何便携式-v的输出格式,就此而言),虽然其他编译器可能有非常类似的东西(我相信英特尔的编译器在这里的行为相同),但是看来你只需告诉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

返回的订单是要搜索的订单,但是&lt;&gt;包括跳过“”包​​括(但“”包括do search&lt;&gt;路径)的路径。在这里,如果需要,cpp的输出会区分两组路径。