不懂 gcc --with-local-prefix, --with-native-system-header-dir=

Posted

技术标签:

【中文标题】不懂 gcc --with-local-prefix, --with-native-system-header-dir=【英文标题】:don't understand gcc --with-local-prefix, --with-native-system-header-dir= 【发布时间】:2016-06-21 18:47:59 【问题描述】:

我正在编译 gcc 并从https://gcc.gnu.org/install/configure.html阅读手册

具体说明

--with-local-prefix=dirname 指定本地包含文件的安装目录。默认为 /usr/local。指定此选项,如果 您希望编译器在本地搜索目录 dirname/include 安装了头文件而不是 /usr/local/include。

我认为这意味着当使用这个版本的 GCC 编译其他二进制文件时,它会在默认的 /usr/.../ 目录之前检查这个目录?

--with-sysroot=dir 告诉 GCC 将 dir 视为包含目标根文件系统(的子集)的树的根 操作系统。目标系统头文件、库和运行时对象 将在那里搜索文件。更具体地说,这充当 如果 --sysroot=dir 被添加到构建的默认选项中 编译器。 如果您指定 --with-native-system-header-dir=dirname 选项,那么 编译器将在 dirname 中的该目录中搜索 native 系统头文件而不是默认的 /usr/include。

要编译 GCC 5.4.0 我 yum install gcc gcc-c++(即 4.8.0),这会将诸如 stdio.h 之类的标头放在 /usr/include/ 中。在我编译了 GCC 5.4.0 并指定它来编译另一个二进制文件后,5.4.0 似乎使用了 /usr/include/ 中的 4.8.0 头文件,而不是在 5.4.0 编译期间创建的头文件。

我真正要问的是,如果我想编译 GCC (5.4.0) 并将 make install 安装头文件以及 GCC 和 G++ 等安装到自定义文件夹中,我应该设置哪些选项?我编译 GCC 5.4.0 的配置是否正确?

/home/myuser/gcc-5.4.0/configure --prefix=/home/gcc540 --disable-multilib --with-system-zlib --enable-languages=c,c++ --with-local-prefix=/home/myotherbin/local --with-gxx-include-dir=/home/gcc540/header
    --prefix=/home/gcc540 设置主目录make install --prefix=/home/gcc540/bin make install 将安装二进制文件(gcc、g++ 等) --prefix=/home/gcc540/lib make install 将安装库 --with-gxx-include-dir=/home/gcc540/headers make install 将为--enable-languages=c,c++ 安装标头 --with-local-prefix=/home/otherprogs(首先在此处搜索来自其他依赖项的库、头文件)即,如果我正在编译 ffmpeg,我将在此处放置 x264 头文件

那么--with-sysroot=dir||--with-native-system-header-dir=dirn 中发生了什么?

此外,在我导出到--with-gxx-include-dir=/home/gcc540/headers 后,我有tr1/stdio.h,其中包含以下代码,

#include <tr1/cstdio>

这会导致错误,因为 stdio.hcstdio 都在同一个文件夹中,应该将 stdio.h 复制到父文件夹,或者最好只传递 -I/home/gcc540/headers -I/home/gcc540 /headers/tr1` 到 gcc 5.4.0?

【问题讨论】:

【参考方案1】:

--with-sysroot 选项仅在您构建交叉编译器时有用:生成的、构建的 gcc 将知道在哪里可以找到目标平台的头文件和库(即,它将具有 --sysroot 选项的默认值) . --with-native-system-header-dir 是对--with-sysroot 选项的改进,允许指定一个目录relative 到为--with-sysroot 指定的目录,native 平台标头将在其中找到。 GCC 将其自己的标头(它作为make install 的一部分复制的标头)与操作系统本身提供的“本机”标头区分开来,并且无论安装了何种 GCC 都已经存在。

【讨论】:

查看这些标志的详细信息。至于我的问题的最后一部分,更改顺序以便 /headers/tr1 出现在 /headers 之前解决了这个问题。【参考方案2】:

你实际上可以得到 gcc 版本 5.3.1 : "devtoolset-4" >> yum install devtoolset-4-gcc-c++

RHEL https://access.redhat.com/documentation/en-US/Red_Hat_Developer_Toolset/4/html/4.1_Release_Notes/index.html

RHEL、CentOS、Fedora https://www.softwarecollections.org/en/scls/rhscl/devtoolset-4 ... 和:软件包也可供下载,需要 5 个软件包:devtoolset-4-gcc-c++, -4-gcc, -4-binutils, -4-运行时,-4-libstdc++-devel。

请指定您的操作系统,以获取更多信息。请提供操作系统名称和版本。


构建 gcc:gcc 需要在源代码之外的 build 文件夹 gcc-5.4.0/ ...这样就可以了:

cd build/
../gcc-5.4.0/configure --prefix=/home/gcc540 --program-suffix=54 --enable-languages=c,c++ --with-system-zlib --disable-multilib

不需要额外的标题。这一切都在 /usr/ ... 来自 gcc-c++ (-4.8) 的安装。


【讨论】:

我需要使用 5.4.0,所以需要编译到非默认目录。 好吧,那就继续吧。删除 build 文件夹中的所有文件,然后运行 ​​../configure -- ... :我通常在编译 gcc 版本的 5.x.x 时完全没有错误。

以上是关于不懂 gcc --with-local-prefix, --with-native-system-header-dir=的主要内容,如果未能解决你的问题,请参考以下文章

C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!

GCC扩展(转--对看kernel代码有帮助

gcc和arm-linux-gcc是啥关系?区别是啥?

gcc编译优化系列gcc编译链接时候--specs=kernel.specs链接属性究竟是个啥?

linux里面线程编译运行问题

Linux | GCC如何实现代码编译&&汇编&&链接过程