我想知道为什么当我gcc -v
在 Arch Linux 下运行时,它会unknown
在这些输出中显示以下单词:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/5.1.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
而在其他发行版中,例如 ubuntu,它显示发行版名称,例如ubuntu
:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-ubuntu-linux-gnu/5.1.0/lto-wrapper
Target: x86_64-ubuntu-linux-gnu
答案1
正如评论中已经提到的,默认情况下目标三元组是由配置.猜测脚本。它的逻辑相当简单。首先它用于uname
获取一些基本的系统信息:
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
这些字符串被组合并与硬编码模式匹配。结果也是硬编码的:
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
...(snip)...
x86_64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
...(snip)...
对于某些系统,可以给出更有意义的结果,例如 IBM 的“rs6000-ibm-aix”。
分发维护者只需用他们自己的字符串(也是硬编码)覆盖该字符串:
$ gcc -v
...(snip)...
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.9.2-10'
...(snip)...
--target=x86_64-linux-gnu
默认情况下,GCC 6 可能会输出 x86_64-pc-linux-gnu:更新了配置.猜测在上游存储库中。
答案2
这是配置/目标三元组的制造商部分。这自动预订对此说道:
manufacturer
A somewhat freeform field which indicates the manufacturer of the system. This is often simply `unknown'. Other common strings are `pc' for an IBM PC compatible system, or the name of a workstation vendor, such as `sun'.
这自动配置手册称之为company
.
我不是 GCC 编译方面的专家,但听起来该字段提供的信息更多的是信息性质,unknown
只是 GCC 使用的默认值,除非显式覆盖。例如,Ubuntu 12.04 上的 GCC 使用x86_64-linux-gnu
Debian 7s GCC i486-linux-gnu
,因此完全可以将该字段留空。