我使用的是Intel的C++編譯器,它在Linux上依賴於GNU提供的libc.so和libstdC++。so。鏈接/運行時不同GCC版本的風險?
這是我的問題。要訪問一些最新的C++ 11功能,我需要使用GCC 4.7或更高版本附帶的libstdC++。但我堅持使用CentOS 6.4。
在CentOS 6.4上,GCC的本地版本是4.4。但是使用名爲「SCL」的RedHat和名爲「devtoolset-1.1」的軟件包,我可以在「/ opt」下安裝GCC 4.7。
我以上述方式設置了使用GCC 4.7,我可以使用更新的C++ 11功能。
所以,這裏是我的問題:如果用戶運行我的程序只有libc.so/libstdC++。的GCC 4.4版本,所以在庫路徑中,是否有風險,我的程序會有錯誤, 4.4和4.7版本的這些庫?
如果存在潛在的問題,我可以通過靜態鏈接GCC 4.7版本的libc和libstdC++來解決它嗎?或者,如果/當我的代碼動態加載的其他庫選擇由系統範圍的GCC 4.4包提供的較舊的libc/libstdC++時,是否設置了自己的其他問題?
謝謝。所以,確實如此簡單,就是確保在GCC 4.7中的libstdC++。so在我的LD_LIBRARY_PATH之前存在於任何其他版本的libstdC++之前,因此,在運行鍼對libstdC++構建的程序時, 如果我的程序使用的其他.so文件之一對libstdC++具有動態鏈接依賴關係,那麼這不會引起問題。但是,其他共享對象是針對早期版本的GCC構建的嗎? (它不一定是世界末日,如果是這樣的話,因爲我的程序對其他庫有很少(直接)依賴關係。) – 2013-03-24 20:39:42
不,它會正常工作。 libstdC++。因此是向後兼容的,所以4.7版本中的'libstdC++。so.6.0.17'可以被4.7或更高版本編譯的任何東西使用(無論如何回到GCC 3.4.0),但它不兼容**,所以4.4中的'libstdC++。so.6.0.13'不能被4.7編譯的東西使用 – 2013-03-24 21:35:04
NB目前對於libstdC++版本之間的C++ 11功能沒有兼容性保證,所以如果代碼加載的其他庫使用C++ 11功能,那麼它們也應該使用4.7進行重新編譯,但是如果它們只使用C++ 03功能那麼更新的libstdC++。這樣可以正常工作。 – 2013-03-24 21:38:15