2013-03-11 96 views
2

我打算編譯一個靜態庫(mylib.a)和gcc 4.7.1。我想要利用C++ 11的優勢,因此使用-std = C++ 11。我編譯這個lib的平臺是帶有glibc-2.8的x86_64 SLES 11。在Linux上編譯和鏈接不同版本的gcc

然後,我想將舊版平臺上的靜態庫與舊版代碼鏈接起來,因此我必須使用gcc 4.1.2來鏈接和編譯舊版代碼。所以在我的庫頭文件中,我不會使用任何C++ 11特定的代碼。我也會鏈接來自gcc.4.7.1的libstdC++。a。我想要鏈接mylib.a,libstdC++。a(gcc4.7.1)和遺留目標文件的平臺是帶有glibc-2.4的x86_64 SLES 10。

我試着用mylib.a中的一些虛擬C++ 11代碼(std :: async())來處理所有這些亂七八糟的事情。我認爲這可能只是因爲ELF的要求。我是否正確思考,或者ELF與它無關?如果mylib.a包含一些真正複雜的邏輯,我應該期待什麼類型的錯誤?

回答

2

Linux has a C++ Application Binary Interface (ABI),這已經有一段時間了。這意味着Linux上的編譯器調用約定和名稱是固定的。因此,只要庫兼容,您應該能夠使用不同的編譯器(或相同編譯器的不同版本)進行編譯,並且可以將代碼正確可靠地鏈接在一起。

不完全是ELF要求本身 ...

2

GCC保證二進制兼容性回到一些古老的版本3.一路只要++要鏈接到的libstdc有新的庫功能,沒有理由不能使用它們。您將不得不使用使用GCC 4.1.2編譯的代碼中的新語言和庫特性。

相關問題