不懂 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.h
和 cstdio
都在同一个文件夹中,应该将 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 你其实一点都不懂!