2012-06-28 92 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