【问题标题】:What are the GCC default include directories?什么是 GCC 默认包含目录?
【发布时间】:2011-06-26 05:36:25
【问题描述】:

当我使用 gcc 编译一个非常简单的源文件时,我不必指定标准包含文件(例如 stdio 或 stdlib)的路径。

GCC 如何知道如何找到这些文件?

它内部是否有硬连线的/usr/include 路径,或者它会从其他操作系统组件获取路径?

【问题讨论】:

    标签: c++ c linux gcc include-path


    【解决方案1】:

    为了弄清楚gcc/g++使用的默认路径以及它们的优先级,您需要检查以下命令的输出:

    1. 对于 C
        gcc -xc -E -v -
    
    1. 对于 C++
        gcc -xc++ -E -v -
    

    感谢Qt Creator 团队

    【讨论】:

    • cpp -v /dev/null -o /dev/null
    【解决方案2】:

    有一个输出较短的命令,它允许自动从行中剪切包含路径,从单个空格开始:

    $ echo | gcc -Wp,-v -x c++ - -fsyntax-only
    ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include-fixed"
    ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../x86_64-redhat-linux/include"
    #include "..." search starts here:
    #include <...> search starts here:
     /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2
     /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/x86_64-redhat-linux
     /usr/lib/gcc/x86_64-redhat-linux/4.8.2/../../../../include/c++/4.8.2/backward
     /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include
     /usr/local/include
     /usr/include
    End of search list.
    

    功劳归于 libc++ front-page

    【讨论】:

    • 使用/dev/null而不是-,你就不需要管道了
    【解决方案3】:

    只需运行以下命令即可列出默认搜索路径:

    $(gcc -print-prog-name=cc1) -v
    

    【讨论】:

    • 这没有列出包含路径。只有程序路径和库路径
    • cc1 通常不能直接调用,因为它是不在 PATH 上的内部命令。也许你想编辑你的答案来描述在哪里可以找到文件。
    • bash:意外标记 `-v' 附近的语法错误
    【解决方案4】:

    虽然我同意 Ihor Kaharlichenko 关于考虑 C++ 的回答以及 abyss.7 关于其输出紧凑性的回答,但对于 gcc 的多架构版本,它们仍然不完整,因为输入处理取决于命令行参数和宏。

    例子:

    echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -specs=nano.specs -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfloat-abi=soft -x c++ -E -Wp,-v\ - -fsyntax-only 产量

    ⋮
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../arm-none-eabi/include/newlib-nano                                                                                                              
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi/thumb/v7e-m/nofp                                         
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
     /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  
    ⋮
    

    echo | /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-g++ -x c++ -E -Wp,-v - -fsyntax-only 产生

    ⋮
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1                                                                        
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/arm-none-eabi                                                          
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include/c++/9.2.1/backward                                                               
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include                                                                                                            
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/include-fixed                                                                                                      
    /opt/gcc-arm-none-eabi-9-2019-q4-major/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/include                                                                                  
    ⋮
    

    前一个调用使用newlib(参见输出的第 1 行和第 3 行),后者使用标准包含。列表末尾的常用文件是include_next的用法示例。

    底线:打印包含目录时,始终考虑所有编译器选项

    【讨论】:

      【解决方案5】:

      总结其他答案:

      对于 C++:

      c++ -xc++ /dev/null -E -Wp,-v 2&gt;&amp;1 | sed -n 's,^ ,,p'

      对于 C:

      cc -xc /dev/null -E -Wp,-v 2&gt;&amp;1 | sed -n 's,^ ,,p'

      【讨论】:

      • 我建议将其设为社区 wiki。
      猜你喜欢
      • 2023-03-14
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      相关资源
      最近更新 更多