2012-08-27 127 views
9

我在優化算法上工作,所以性能確實很重要。使用VS 2010進行編譯時,該算法的速度比VS 2008快8倍。谷歌搜索表明,這不是我的錯(例如見https://stackoverflow.com/a/5560184/890355)。問題是,最終的項目必須VS 2008在VC++ 2008項目中使用VC++ 2010運行時庫

我更傾向於解決方案是建立在我2010 VS算法DLL,然後將其鏈接到主項目下建造的。 VS 2008下的DLL可以使用VC++ 2010運行時庫嗎?如果是這樣,那麼做到最痛苦的方式是什麼? 有沒有其他想法? 謝謝。

+0

C++編譯器不支持C++ 0x中,如果這是你的要求。當然,如果您想要避免升級到Visual Studio 2010和/或Visual Studio 2012,您總是可以使用更新的編譯器。一種可能的解決方案是使用不同的編譯器編譯優化算法本身,並引用由所述編譯器創建的輸出。 –

+2

你的庫是否在對象之間傳遞對象,並期望對方釋放對象?圖書館混合可能會起作用,但有一些相當有限的警告(並使用C++容器可能會導致不好的魔法):http://stackoverflow.com/questions/6531401/how-to-use-vs2010-built-dlls-in -vs2008 - 簡而言之,如果你能保持所有內容的一致性並且只使用一個C++運行庫,那就更容易了。 – birryree

+3

當你使用VS2010的#include文件時,這隻能是一個好的結果。哪個不行,VS2008無法編譯它們,特別是因爲你在移動語義之後進行了perf的改進。 –

回答

1

如果你問任何其他方式在比外面移動2010部分爲DLL等一個可執行結合2008年和2010年的庫比答案很可能是「沒有其他簡單的方法來實現這一目標」。

但是,如果你不想「VC++ 2010運行時的VS 2008下的圖書館...」(即建立在對2008年的老IDE 2010和庫),但「在2008年使用2010編譯DLL編譯的程序「,這是完全可能的。

最簡單的方法,就像我們在項目中做的那樣,對靜態鏈接的標準庫(如果你使用它)建立(包括.exe和DLL),然後在你的.exe中使用LoadLibrary加載DLL。在DLL中,您可以導出(_declspec (dllexport))函數(最好在extern "C" {}警衛中),並通過GetProcAddress在.exe中使用它。

靜態鏈接和顯式裝載救你脫離了很多不同而造成的運行時間不一致的錯誤。

如果您擔心DLL加載和函數調用成本,可以嘗試儘可能少地調用這些調用(可能不僅要移動算法,還要將一些更高級別的邏輯移動到DLL中)。請參閱this issie

您可以使用native multitargeting在一個IDE(2010)中構建所有代碼(但是您仍然需要分別針對v9和v10庫分別構建主應用程序和DLL)。

3

運行時不是問題。沒有什麼能阻止你將DLL鏈接到VC2010運行庫,然後在其他項目中使用該DLL。這些項目是否使用Visual C++ 2008或其他語言構建並不重要。

棘手的部分是設計DLL接口。簡單地導出一些C++類是有風險的,因爲它暴露了不同編譯器之間的不兼容問題。我認爲你最好的選擇是展示一個C風格的界面或者使用COM。我認爲COM是最好的方法,但是如果你對這項技術不熟悉,那麼C風格的界面可以正常工作。 (COM也可能超過殺,如果界面是簡單的。)