2011-06-27 41 views
12

我正在編寫一個庫,它必須依賴目前沒有編譯支持新標準的庫。我想編譯一個庫,它必須依賴那些std = C++ 0x的庫。這樣做有什麼問題嗎?混合使用庫和不使用std = C++的任何問題0x

+1

標題可能是一個問題,請參閱此處:http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html – 2011-06-27 14:10:14

回答

11

如果將使用不同編譯器選項編譯的庫混合使用,則必須確保接口中數據類型的ABI相同。某些數據類型(例如std::string)在C++ 03和C++ 0x之間有不同的接口和要求,因此使用它們的接口必須小心。

如果你的接口只使用內置類型和你自己的類,並且它們本身不使用任何標準庫類,那麼一切都應該沒問題。否則,您需要檢查您正在使用的特定子集。

+1

僅在界面上使用C通常是不夠的。在Unix下靜態鏈接時它不起作用,在動態鏈接時它需要'dlopen'的特殊選項,並且在Windows下,由/ MD或/ MDd引入的庫中存在一個錯誤,這意味着它會在if其中任何一個庫都使用'std :: string',並使用不同的選項進行編譯。 (我聽說這個bug已經在VC10中修復了。) –

+0

@James:我一般都同意,但是這個問題被標記爲** gcc **。據我瞭解,gcc庫開發人員的目的是提供你應該能夠在同一個程序中使用'-std = C++ 98'和'-std = C++ 0x'代碼,只要這些代碼位之間的接口只使用兼容的類型。例如在Linux上,只有一個'libstdC++。so'二進制文件,被'-std = C++ 98'和'-std = C++ 0x'代碼使用。 –

+0

開發人員的目的是實際發生的。我在使用'.so'執行'dynamic_cast'時遇到了問題,並且該對象是在另一箇中構建的。並且,爲了使'dynamic_cast'工作所需的'dlopen'選項,您最終將共享其他一些函數,包括'std :: vector'的成員函數等等。而std: :vector'依賴於編譯器選項;你甚至不必爲了失敗而改變版本。 –

3

簡單的答案是否定的,除非供應商明確保證(甚至當時)。實際上,所有鏈接在一起的代碼必須使用相同的標準庫,並使用相同的選項編譯相同版本的編譯器。至少對於動態鏈接庫來說,至少對於動態鏈接庫來說,這些方法是有效的,但只有當庫之間的接口是純C時,纔可以工作,並且在鏈接時採取特殊步驟(特殊選項爲dlopen - 兩種庫都不使用VC++ ++中的std::string pre-版本10等)。否則,你正在尋找麻煩。