2012-06-28 55 views
0

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

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

+2

这看起来不好主意;您需要更新代码以使用更现代的编译器进行编译。 – trojanfoe

+0

@trojanfoe - 是的,我知道它是一个坏主意。但不幸的是,我现在必须忍受它。 – Rajat

回答

2

是的,没关系。

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

+0

谢谢。我现在明白了。 – Rajat

1

库中的/lib/usr/lib以及它们的64位对应文件是系统范围的库。他们应该是编译器中立和其他编译器除了GCC还可以链接到他们,他们实际上这样做,尤其是因为libc是唯一一种与操作系统内核接口的便携式方式。

libc作家采取非常谨慎,以这样的方式写自己的头文件,以使不同的编译器产生,以便正确地在库中的代码界面相同的二进制内存对象。此外,还有一个定义良好的OS ABI接口,所有编译器都遵循这个接口,以便彼此兼容。对于除C之外的其他语言可能并非如此,例如来自不同C++编译器版本的对象文件很少会彼此顺利。

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

+1

请注意,发行版默认libstdC++驻留在那些lib /文件夹之一中,但该库至少依赖于gcc的主要版本。 – nos