簡體   English   中英

Visual Studio C ++ DLL庫在Qt應用程序中崩潰

[英]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庫。

問題:

  • 是否使用Windows的Qt庫(VS 2010)和Visual Studio工具鏈不足以克服ABI兼容性問題?
  • 這是否意味着我應該自己編譯Qt框架?
  • 請幫忙 - 歡迎任何想法......

在一個項目中,我的情況很像你的,兩個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM