[英]Visual Studio C++ dll library crashes in Qt application
我在MS Visual C ++ DLL庫和Qt程序之間共享“std :: string”數據時遇到問題。
用Visual C ++ 2010 Express編寫的DLL庫,它導出一個方法:
extern "C" __declspec(dllexport) int Init(ITest* commandTest);
抽象界面“ITest”和實現它的類:
class CTest: public ITest { public: CTest(); virtual ~CTest(); virtual void getVersion(std::string & version) const; };
Qt GUI應用程序需要:
* load the DLL dynamically * instantiate CTest and pass it to exported Init method.
在DLL的“Init”中,調用“CTest :: getVersion()”方法。 我希望它會填充“&version”字符串。當我用新字符串填充“&version”時,我得到的是崩潰。
從http://qt-project.org/downloads下載了“Qt libraries 4.8.3 for Windows(VS 2010,235 MB)”,安裝它並在QtCreator的項目設置中選擇它。
在QtCreator中從MinGW工具鏈切換到使用MS Visual Studio 2010 Express安裝的工具鏈。
我認為它將克服這個問題,因為我使用了VS 2010編譯的Qt庫,Qt GUI也用VS C ++工具鏈編譯。 不幸的是問題沒有消失,所以我嘗試了最后一步:
在Visual Studio中創建Win32控制台應用程序,通過LoadLibrary加載我的DLL,使用“Init”方法,就像我在Qt GUI中一樣...並且它工作!
在“CTest :: getVersion()”中,我打印通過引用傳遞給控制台的“版本”字符串。 使用VS C ++控制台應用程序作為主機時,它將正確打印出來。 當使用Qt應用程序時 - “版本”字符串打印出一些垃圾(例如┌►☻qwerty27)
這讓我覺得Qt app和我的DLL的ABI仍然不兼容,即使使用上面提到的Qt VS 2010庫。
在一個項目中,我的情況很像你的,兩個DLL,相同的編譯器(VC ++ 2010)。 我正在將std :: string從一個傳遞到另一個並且發生了很多崩潰。
問題是一個DLL使用多線程調試DLL(/ MDd)編譯,另一個DLL使用多線程調試(/ MTd),這導致兩個DLL(崩潰)之間的二進制不兼容。 此外,版本必須匹配,對兩個DLL使用DEBUG或RELEASE。
看看你的項目,兩個DLL似乎都在使用多線程調試DLL(/ MDd) 。 這意味着兩者都在使用MSVCP100D.dll 。 這沒關系,唯一的問題是來自QT網站的qt的VC ++版本是在RELEASE模式下編譯的,並且正在使用MSVCP100.DLL
我的建議是將您的運行時庫更改為DEBUG配置的多線程DLL(/ MD) 。
我的第二個建議是遵循Rebert的建議並使用char *而不是std :: string。 char *無論如何都會兼容。
您還可以使用多線程調試DLL(/ MDd)重新編譯QT,並使用該版本的QT進行DEBUG配置(但這似乎很有用)。
名義上我不想冒險在應用程序和DLL之間傳遞復雜的數據(在我的控制之外,代碼方面)。 我會求助只傳遞POD結構,即我將接口更改為:
class CTest: public ITest
{
public:
CTest();
virtual ~CTest();
virtual void getVersion(char* versionBuffer, unsigned length) const;
};
讓生活更輕松;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.