【问题标题】:Obtaining the include paths cpp searches获取包含路径 cpp 搜索
【发布时间】:2011-04-26 11:59:24
【问题描述】:

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

我试过了:

cpp -v </dev/null | unusually_complex_filter

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

【问题讨论】:

  • 似乎 cpp -v /null 输出诸如“--with-gxx-include-dir=/usr/include/c++/4.4”之类的东西,这对您有帮助吗?
  • 这因语言而异(最明显的是 C 与 C++),具体取决于编译器。您打算如何处理在 makefile 中使用 CPPFLAGS 变量的项目?什么是purpose of your script?

标签: preprocessor posix c-preprocessor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    像这样使用 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"
    

    还有更多的行。

    您显然会得到很多“重复”,因为许多包含文件也包含在其他包含文件中。

    【讨论】:

      【解决方案3】:

      经过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
      

      返回的顺序是搜索的顺序,但是包含跳过“”包​​含的路径(但“”包含做搜索路径)。在这里,cpp 的输出确实区分了两组路径,如果需要的话。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 2014-12-13
        • 2013-07-14
        • 2015-03-12
        • 1970-01-01
        • 2011-09-16
        相关资源
        最近更新 更多