我正在編寫一個庫,它必須依賴目前沒有編譯支持新標準的庫。我想編譯一個庫,它必須依賴那些std = C++ 0x的庫。這樣做有什麼問題嗎?混合使用庫和不使用std = C++的任何問題0x
回答
如果將使用不同編譯器選項編譯的庫混合使用,則必須確保接口中數據類型的ABI相同。某些數據類型(例如std::string
)在C++ 03和C++ 0x之間有不同的接口和要求,因此使用它們的接口必須小心。
如果你的接口只使用內置類型和你自己的類,並且它們本身不使用任何標準庫類,那麼一切都應該沒問題。否則,您需要檢查您正在使用的特定子集。
僅在界面上使用C通常是不夠的。在Unix下靜態鏈接時它不起作用,在動態鏈接時它需要'dlopen'的特殊選項,並且在Windows下,由/ MD或/ MDd引入的庫中存在一個錯誤,這意味着它會在if其中任何一個庫都使用'std :: string',並使用不同的選項進行編譯。 (我聽說這個bug已經在VC10中修復了。) –
@James:我一般都同意,但是這個問題被標記爲** gcc **。據我瞭解,gcc庫開發人員的目的是提供你應該能夠在同一個程序中使用'-std = C++ 98'和'-std = C++ 0x'代碼,只要這些代碼位之間的接口只使用兼容的類型。例如在Linux上,只有一個'libstdC++。so'二進制文件,被'-std = C++ 98'和'-std = C++ 0x'代碼使用。 –
開發人員的目的是實際發生的。我在使用'.so'執行'dynamic_cast'時遇到了問題,並且該對象是在另一箇中構建的。並且,爲了使'dynamic_cast'工作所需的'dlopen'選項,您最終將共享其他一些函數,包括'std :: vector'的成員函數等等。而std: :vector'依賴於編譯器選項;你甚至不必爲了失敗而改變版本。 –
簡單的答案是否定的,除非供應商明確保證(甚至當時)。實際上,所有鏈接在一起的代碼必須使用相同的標準庫,並使用相同的選項編譯相同版本的編譯器。至少對於動態鏈接庫來說,至少對於動態鏈接庫來說,這些方法是有效的,但只有當庫之間的接口是純C時,纔可以工作,並且在鏈接時採取特殊步驟(特殊選項爲dlopen
- 兩種庫都不使用VC++ ++中的std::string
pre-版本10等)。否則,你正在尋找麻煩。
- 1. 有問題的std :: C++ 0x中
- 2. 使用clang編譯失敗,使用libstdC++ 4.4.7和-std = C++ 0x
- 3. 問題混合C和C++
- 4. 如何在g ++的-std = C++ 0x模式下使用strlcpy?
- 5. 使用C++/C混合COBOL
- 6. 使用不推薦使用的綁定器和C++ 0x lambdas
- 7. 使用的的C++ 0x
- 8. 如何爲std :: fill()使用C++ 0x lambdas局部變量?
- 9. 使用std :: copy的問題
- 10. 如何在一個pod庫中混合使用Swift和Objective-C?
- 11. C++ 0x線程問題
- 12. Qt:CONFIG + = C++ 11,但-std = C++ 0x
- 13. 混合使用constexpr和const?
- 14. 關於在C++中使用r值的問題0x
- 15. CUDA和Thrust library:將.cuh .cu和.cpp文件與-std = C++一起使用時遇到問題0x
- 16. 混合使用NSXPCConnection和xpc C API
- 17. 混合使用C#和Java語言
- 18. C#混合使用任務和Dispatcher.Invoke,爲什麼它停止?
- 19. NASM使用C混合
- 20. 與C#4.0混合使用
- 21. 混合使用C#功能
- 22. 如何在C++(C++ 0x)中使用'auto'?
- 23. 問題與模板和lambda C++ 0x
- 24. 混淆使用std ::少和std ::有更大的std ::排序
- 25. 使用std :: bind佔位符和boost庫的問題
- 26. 我們可以混合使用__extension__和-std = c99嗎?
- 27. 混合C++和Fortran鏈接問題
- 28. Qt - 混合Qt和std :: C++類型
- 29. 關於在AWS上使用混合MyISAM和InnoDB的問題RDS
- 30. 使用AngularJS,Parse-Server和Heroku混合內容的問題
標題可能是一個問題,請參閱此處:http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s02.html – 2011-06-27 14:10:14