如何停止 g++ 链接/包括来自 /usr/* 的旧系统头文件/库?

fpg*_*ost 3 gcc

我想运行一些代码的服务器在标准位置安装了旧版本的 gcc(gmp、mpc、mpfr),比如/usr*管理员不愿意更新,但允许我在我的/home/username目录中安装更新版本的 gcc 。我已经这样做了,现在g++d46在我的主目录中安装了 gcc 4.6.3 /home/myusername/opt2/gcc-4.6.3。我也安装了 gmp,mpfr,mpc /home/myusername/tmp/gcc/{include,lib,share}

我已经出口{LD_LIBRARY_PATH, LIBRARY_PATH,LD_RUN_PATH}=/home/myusername/tmp2/gcc/lib:/home/myusername/opt2/gcc-4.6.3/lib/gcc/x86_64-unknown-linux-gnu/4.6.3:/home/myusername/opt2/gcc-4.6.3/lib64:PATH=/bin:/usr/bin:/home/myusername/opt2/gcc-4.6.3/bin:{C_INCLUDE_PATH,CPLUS_INCLUDE_PATH}=/home/myusername/tmp2/gcc/include:/home/myusername/opt2/gcc-4.6.3/include/c++/4.6.3:

然后我编译一些测试代码

g++d46 -g -O3 -I/home/myusername/tmp2/gcc/include -L/home/myusername
/tmp2/gcc/lib -Wall testMPFR3.cpp -o myBin -lgmp -lgmpxx -lmpfr
Run Code Online (Sandbox Code Playgroud)

编译并执行正常,但在这样做时,ldd myBin我发现尽管主要与我的主目录中的正确库链接,但我们也有:

libm.so.6 => /lib64/libm.so.6 (0x0000003917e00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003917a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003917600000)
Run Code Online (Sandbox Code Playgroud)

这不是我的家目录,它是如何知道到别处,鉴于ENV乏我已经出口,我-I-L标志?

此外,如果我确实g++ -H要查看标题的来源,那么大多数(包括新的 gmp,幸好 mpfr)来自我的家庭目录,但也有一些:

..... /usr/include/sys/cdefs.h
...... /usr/include/bits/wordsize.h
..... /usr/include/gnu/stubs.h
...... /usr/include/bits/wordsize.h
...... /usr/include/gnu/stubs-64.h
........ /usr/include/stdio.h
........ /usr/include/bits/wchar.h
........ /usr/include/xlocale.h
....... /usr/include/locale.h
 ..... /usr/include/ctype.h
....... /usr/include/bits/types.h
........ /usr/include/bits/wordsize.h
........ /usr/include/bits/typesizes.h
....... /usr/include/endian.h
........ /usr/include/bits/endian.h
........ /usr/include/pthread.h
......... /usr/include/sched.h
.......... /usr/include/time.h
.......... /usr/include/bits/sched.h
......... /usr/include/time.h
.......... /usr/include/bits/time.h
......... /usr/include/signal.h
.......... /usr/include/bits/sigset.h
......... /usr/include/bits/pthreadtypes.h
.......... /usr/include/bits/wordsize.h
......... /usr/include/bits/setjmp.h
.......... /usr/include/bits/wordsize.h
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我的本地 gcc-4.6.3 缺少这些?/usr/*如果在主目录中找不到它们,链接器又如何知道要恢复?

--nostdinc也许我可以在编译时使用该标志,但这可能无法解决由于某种原因在本地无法找到上述标头的问题。

pet*_*rph 6

标头你都在提,以及/lib64/libc.so/lib64/libm.so属于glibc的(如位置/lib64已经表明,这些是核心系统文件(否则他们将在/usr/lib64)。如果您编译它自己的副本,你可以反对链接,当然你的程序。但是除非这对你来说真的很重要,否则尽量不要 - 基本上所有的东西都链接到 libc,这意味着你应该重新编译所有东西(包括你的 GCC 和它可能依赖的任何东西)以确保你最终不会得到一个二进制文件,那链接 lib-xyz 和您的 glibc 安装,而 lib-xyz 将使用系统 glibc。这可能会产生一些令人讨厌的副作用。

如果您有兴趣构建一个更新的工具链,它当然可以完成,但要正确地完成,您可能应该从头开始研究Linux并撕掉适用于您的用例的部分。

至于动态链接器的工作原理 - 检查man ld.so(正如我在您之前的问题中所建议的那样)。要了解GCC为包括头如何搜索,你可能想了解-I--sysrootman gcc