2012-06-06 40 views
4

我正在寫一個測試C dlll,包含一些函數的小型C++程序。這些DLL存在於調試版本和發行版本中,我想用相同的程序加載它們,並將它們與以前的版本進行比較。dll在調試模式下,在發佈模式下調用程序(反之亦然)

問題是,當我使用release config編譯我的程序時,它只能使用也是release的dll,而當我使用debug config編譯程序時,它只能使用也是debug的dll。

我使用LoadLibrary和GetProcAddress函數加載dll /函數。

有兩種類型的功能: void type1(int&)void type2(vector<string>*)。 類型1工作正常,無論配置。 但類型2僅在配置匹配時才起作用。

代碼:

 
typedef void(*GetNames)(vector<string>*); 
GetNames get_var_names = (*GetNames)GetProcAddress(dll,"get_var_names"); 
vector<string> var_names; 
get_var_names(&var_names); 

最後一行是該計劃失敗,這樣的錯誤,其中「0000005:訪問衝突讀取位置0xbaadf008」如果調用程序和dll的配置不匹配。 該錯誤是一個閱讀違規當程序是釋放和DLL調試,但寫程序時,調試程序和DLL是釋放。

函數應該做的只是用不同的字符串調用push_back(「x」)幾次。

在釋放配置程序中使用調試DLL或類型1的所有函數都不起作用似乎不是完全不可能的,所以它似乎與向量或字符串類有關。

任何人都有任何想法如何解決這個問題或正在使用兩個不同配置的可執行文件我唯一的選擇?

+0

請給出您用於兩種配置的編譯器選項。例如,每個配置可能使用不同的默認調用約定(或其他一些使它們不兼容的選項)。 – cdhowie

+1

您可以關閉迭代器調試以使它們兼容。但是,當醫生的建議像這樣傷害時,只是不這樣做。 –

回答

4

很多(如果不是全部的話)STL類爲DEBUG構建使用不同的佈局。因此,你不能在程序的RELEASE-build中使用這樣的DEBUG編譯的類(如std :: string和std :: vector),反之亦然。

應該避免在您的dll的界面中使用STL類型/類,而應該使用內置類型。 在這種情況下,你永遠不會有這些問題。

順便說一句:我正在談論MSVC++當然(我不知道其他編譯器)。

相關問題