2013-04-08 150 views
4

我爲CentOS 6.3使用devtoolset-1.0以臨時升級GCC版本。雖然我現在能夠編譯我的C++應用程序,最終的二進制缺少一些符號:CentOS:使用devtoolset中的GCC 4.7導致鏈接libstdC++不正確(未定義的符號)

$ ldd -d -r myapp 
$  [..] 
$  libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003216e00000) 
$  [..] 
$ undefined symbol: _ZNSt8__detail15_List_node_base11_M_transferEPS0_S1_ (./myapp) 
$ undefined symbol: _ZNSt8__detail15_List_node_base7_M_hookEPS0_  (./myapp) 
$ undefined symbol: _ZNSt8__detail15_List_node_base9_M_unhookEv (./myapp) 

我想通了,這些都是一些新的功能,這是不是在「老」的libstdC++發現,但在一個更新的libstdC++中。在我的系統上,安裝了libstdC++(默認版本4.4.7)和devtoolset-1.0-libstdC++ - devel(4.7通過devtoolset)。有趣的是,從devtoolset的的libstdC++鏈接agains老之一:

$ cat /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/libstdc++.so 
$ /* GNU ld script 
$ Use the shared library, but some functions are only in 
$ the static library, so try that secondarily. */ 
$ OUTPUT_FORMAT(elf64-x86-64) 
$ INPUT (/usr/lib64/libstdc++.so.6 -lstdc++_nonshared) 

什麼其實我想要的是更換的libstdC++綁定,但我不知道該如何實現這個目標。我已經嘗試設置LD_LIBRARY_PATH並指向devtoolset目錄,但libstdC++仍然設置爲舊位置。另外一個符號鏈接沒有成功,因爲它是一個ld腳本而不是實際的共享庫。

+1

你曾經找到解決這個問題的辦法嗎?另外,我很好奇在調試版本和發佈版本中是否有不同的缺失符號,這也是我觀察到的。 – 2015-06-03 15:37:52

回答

1

GCC編譯器及其庫(特別是g++和相應的libstdc++運行時)需要匹配。使用較新的編譯器進行編譯將會得到(如果支持該語言的新版本,通常會得到實際保證)會提供不適用於較舊庫的二進制文件。較舊的二進制文件可能與較新的庫一起工作,這裏沒有保證。

相關問題