0

我有 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库?

4

2 回答 2

2

是的,没关系。

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

于 2012-06-28T07:58:09.037 回答
1

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

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

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

于 2012-06-28T08:08:13.447 回答