链接到旧版本的 gcc

Linking to older version of gcc

本文关键字:gcc 版本 链接      更新时间:2023-10-16

我有 CentOS 6.2(64 位,默认为 gcc 4.4.6)。不幸的是,我的代码只能使用 gcc 3.4.6 编译,所以我在/home/rajat/local 下单独安装了 gcc(从源代码)。在链接一个简单的"Hello World"程序时,我得到以下内容。

>ldd a.out 
linux-vdso.so.1 =>  (0x00007fff215ff000)
libstdc++.so.6 => /home/rajat/local/lib64/libstdc++.so.6 (0x00007f11853e7000)
libm.so.6 => /lib64/libm.so.6 (0x00000033be400000)
libgcc_s.so.1 => /home/rajat/local/lib64/libgcc_s.so.1 (0x00007f11851ce000)
libc.so.6 => /lib64/libc.so.6 (0x00000033bd000000)
/lib64/ld-linux-x86-64.so.2 (0x00000033bcc00000)

虽然 stdc++ 和 gcc 链接到我的 3.4.6 库,但 libm 和 libc 仍然链接到默认库。可以吗??3.4.6 安装也没有产生 libm 或 libc 库?

是的,没关系。

libc/libm 是 glibc 的一部分,而不是 gcc 编译器。 libstdc++ 另一方面是 gcc 的一部分。

/lib/usr/lib 中的库及其 64 位对应项是系统范围的库。它们应该是编译器中立的,除了GCC之外的其他编译器也可以链接到它们,而且它们实际上确实如此,特别是因为libc是与操作系统内核接口的唯一可移植方式。

libc编写器非常注意编写头文件,以使不同的编译器生成相同的二进制内存对象,以便与库中的代码正确交互。此外,还有一个定义明确的OS ABI接口,所有编译器都遵循该接口,以便彼此兼容。对于 C 以外的语言来说,这可能并非如此,例如,来自不同C++编译器版本的目标文件很少彼此配合得很好。

特定于编译器的库未安装在/lib/usr/lib中,有时可以静态链接,以便可以删除依赖项。