【问题标题】:What are the "STANDARD SYSTEM DIRECTORIES" that gcc refers to? (On a unix like system)gcc 所指的“标准系统目录”是什么? (在类似unix的系统上)
【发布时间】:2020-07-31 06:38:21
【问题描述】:

我一直在探索编译器和交叉编译器。我正在阅读 GCC 手册。 具体来说,我对手册中有以下陈述有疑问:

链接器搜索库的标准目录列表。搜索的目录包括几个标准系统目录以及您使用 -L 指定的任何目录。

-isystem 和 -idirafter 选项还将目录标记为系统目录,以便它获得与标准系统目录相同的特殊处理。

好的,这些“系统目录”是什么?在 Linux 机器上,本地编译器的系统目录是什么?

如果我已经构建了一个交叉编译器(就像这里显示的那样:https://wiki.osdev.org/GCC_Cross-Compiler),关于这个编译器的“系统目录”是什么?

我可以在构建 GCC 时更改系统目录吗?此外,sysroot 是从哪里来的?

【问题讨论】:

标签: c linux gcc osdev binutils


【解决方案1】:

“标准”系统目录不是特定目录 - 它可能因安装/发行版而异。

gcc 有一个选项-print-search-dirs。使用它可以获取目录列表,它会查找。

类似:

gcc -print-search-dirs | grep libraries | sed 's/libraries: =//g' | tr ':' '\n' | xargs readlink -f 

交叉编译器也一样(你可以调用交叉编译器的前端而不是普通的gcc)。

--sysroot 直截了当:

--sysroot=dir 使用 dir 作为头文件和库的逻辑根目录。例如,如果编译器通常搜索头文件 在 /usr/include 和 /usr/lib 中的库中,它改为搜索 dir/usr/include 和 dir/usr/lib.

如果您同时使用此选项和 ​​-isysroot 选项,则 --sysroot 选项适用于库,但 -isysroot 选项适用于头文件。

GNU 链接器(从 2.16 版开始)具有必要的支持 对于这个选项。如果您的链接器不支持此选项,则 --sysroot 的头文件方面仍然有效,但库方面 没有。

【讨论】:

  • 构建gcc时可以修改这些系统目录吗? GCC 如何知道哪个系统目录适用于哪个操作系统?
  • 相信在编译gcc的时候可以指定额外的目录。虽然我不太清楚怎么做。或许您可以从ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-9.3.0 查看最新的 gcc 并查看配置选项。
  • 其他目录?那么最低限度是多少呢?
  • 另外,我的意思是除了系统库所需的目录之外。编译 gcc 时,默认的目录集将由安装过程设置(这不是您需要担心的事情)。我的印象是您希望默认搜索更多个目录。
  • 并且使用 --sysroot 会搜索 $(SYSROOT)/"system directory" 而不是 /"system directory"?还是会在这两个地方都搜索?
【解决方案2】:

如果不可配置,GCC 什么都不是。

在构建实例GCC时,需要完全指定目标环境。 (幸运的是,已经为您完成了大部分工作。)如有必要,您可以在构建之前调整这些设置中的任何一个。这些设置在 GCC 内部手册中有详细描述,但您感兴趣的特定设置在描述 Target Macros 的章节中,特别是关于 Controlling the Compilation Driver 的部分。在最后一节中,您将找到定义包含路径的各种宏的描述。 (在该页面中搜索“包含”一词。阅读您找到的所有内容:-); GCC 文档不是教程。)

【讨论】:

    猜你喜欢
    • 2018-02-02
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多