c - gcc 所指的“标准系统目录”是什么?(在类似unix的系统上)
问题描述
我一直在探索编译器和交叉编译器。我正在阅读 GCC 手册。具体来说,我对手册中有以下陈述有疑问:
链接器在标准目录列表中搜索库。搜索的目录包括几个标准系统目录以及您使用 -L 指定的任何目录。
-isystem 和 -idirafter 选项还将目录标记为系统目录,以便它获得与标准系统目录相同的特殊处理。
好的,这些“系统目录”是什么?在 Linux 机器上,本机编译器的系统目录是什么?
如果我构建了一个交叉编译器(就像这里显示的那样:https ://wiki.osdev.org/GCC_Cross-Compiler ),关于这个编译器的“系统目录”是什么?
构建 GCC 时可以更改系统目录吗?此外,sysroot 在哪里出现?
解决方案
“标准”系统目录不是特定目录 - 它可能因安装/发行版而异。
gcc
有一个选项-print-search-dirs
。使用它可以获取目录列表,它会查找。
就像是:
gcc -print-search-dirs | grep libraries | sed 's/libraries: =//g' | tr ':' '\n' | xargs readlink -f
交叉编译器也是一样的(你会调用交叉编译器的前端而不是 plain gcc
)。
--sysroot
是直截了当的:
--sysroot=dir 使用 dir 作为头文件和库的逻辑根目录。例如,如果编译器通常在 /usr/include 中搜索头文件,在 /usr/lib 中搜索库,则它会搜索 dir/usr/include 和 dir/usr/lib。
如果同时使用此选项和 -isysroot 选项,则 --sysroot 选项适用于库,但 -isysroot 选项适用于头文件。
GNU 链接器(从 2.16 版开始)对此选项具有必要的支持。如果您的链接器不支持此选项,则 --sysroot 的头文件方面仍然有效,但库方面不支持。
推荐阅读
- javascript - 传单多边形突出显示问题
- excel - 溢出范围:将数组转换为与 @ 的交集值
- angularjs - Angularjs 1.7.9 - 可能未处理的拒绝
- python - 从 Python 中的子列表中获取元素
- node.js - 分子 pub/sub 良好实践
- java - 如何在Java中使用正则表达式来匹配单个或多个方括号中的多个或单个值?
- php - Laravel - 如果选择条件
- php - 在 XAMPP 问题中将 PHP 与 MySQL DB 连接
- php - PHP preg_match() 提取文本但匹配的字符串为空
- reactjs - 按下箭头键时如何动态地将鼠标悬停在反应列表元素上?