3

我打算用一個用C++編寫的C++庫(不是.NET,也不用MFC)。該庫可用Visual Studio 2005/Intel Fortran 9.1和VS 2008/Intel Fortran 10.1編譯。使用Visual Studio 2008編譯的C++ dll可以與Visual Studio 2005一起使用嗎?

很明顯,我要抓住VS 2008的二進制文件,因爲這是我計算機上的環境,但我很好奇,是否有理由說爲什麼直接C++庫在VS 2005和2008之間不兼容。 d假設這個名字是相同的,但也許還有其他原因。我很久沒有使用過C++,所以在涉及到這些事情時我有點生疏。

回答

2

您遇到的最大問題是CRT的使用情況。如果CRT(C運行時間)靜態鏈接到DLL中,則不應該有任何問題。

但是,如果CRT動態鏈接到項目中,您可能會遇到麻煩。 Visual Studio 2005和2008使用不同版本的CRT,並且它們不能輕鬆加載。但是,如果一個或兩個DLL靜態連接CRT,你應該體面得體。

+0

謝謝。我發現這篇文章詳細介紹了鏈接http://msdn.microsoft.com/en-us/library/ms235460.aspx的一些問題。我擁有的庫基本上是一個文件I/O庫,因此動態鏈接可能是一個更好的主意(取決於它的使用方式)。 – 2009-08-02 20:47:24

+0

而我只是用dumpbin/imports來查看它,並且庫是動態鏈接到CRT的。 – 2009-08-02 20:55:53

3

它應該可能工作。使用VS 2005編譯的DLL將依賴於VS 2005的C標準庫(msvcr80.dll)的實現,而您的代碼將取決於VS 2008的C庫(msvcr90.dll)。這意味着在運行時,C庫的兩個版本都會被加載,這是可以的,但它會增加您的內存使用量並減少很少的加載時間。

3

正如其他海報評論過的,您應該能夠以這種方式工作。

但是,有一個問題可能是一個大問題 - 內存管理。特別是C++運行時可能會非常棘手。

最大的問題是2005年和2008年的運行時間如何管理內存之間存在一些不兼容的問題。一切工作正常,只要你總是在你的VS2008 DLL中分配你的內存,並且總是刪除你的DLL內部分配的內存。這通常需要在DLL中製作一些「額外的」工廠和清理方法,然後公開這些方法。

如果您從VS 2008 DLL中分配內存,然後將其從使用VS 2005編譯的代碼中刪除,反之亦然,您可能會遇到一些非常難以調試的問題。它通常會起作用,但隨機崩潰或不穩定。

相關問題