Problems with deploying Qt5 application on windows

2019-02-19 11:08发布

问题:

So I have Visual Studio 2013 (community edition) with Qt addin installed, Qt5 libraries (32bit), and I'm trying to create an executable that is independent of all development configurations (it may use static or shared libs, I don't really care at this point).

OS: Windows 7, x64.

For doing this I changed the Solution Confguration visual studio option from Debug to Release, and add all the necessary libs in Configuration Properties -> Linker -> Input -> Additional Dependencies. The application now starts only if I run it from visual IDE, If I try to start it from the generated .exe I got The application was unable to start correctly (0xc000007b) error.

I have searched and found that this error code indicates one of the following problems:

  • 32-bit app tries to load a 64-bit DLL (not my case I think, Qt DLLs are 32bit (I have installed using this .exe: qt-opensource-windows-x86-msvc2013-5.5.0.), and I use some other .DLLs which are also 32bit).
  • There are some missing DLLs. (I did copy all the necessary Qt DLLs in the same folder with the final executable).

For checking what dependencies my app requires, I opened the .exe file with Dependency Walker application, this is what it shows me:

in this list were also Qt5Multimedia.dll and Qt5SerialPort.dll, I get rid of the errors by copying the .DLLs in the same folder with the .exe.

Any ideas how to solve this?

回答1:

You should never do that operation manually unless the standard procedure completely fails. There is already standard tool for Qt Windows deploymend windeployqt.

It takes care about Qt DLL dependencies, makes a copy of platforms\qwindows.dll and also it makes a copy of libraries that you cannot detect with the Dependency Walker, since image plugins and some other are loaded at runtime.

You do not even need to have your Qt bin folder in your environment PATH. The simplest deployment:

  • copy built exe binary to a new folder
  • open cmd console in that folder
  • call windeployqt using its full path (if it is not in the system PATH) and provide your executable, for example:
    c:\Qt\Qt5.5.1-vs2013-x64\5.5\msvc2013_64\bin\windeployqt.exe application.exe
    

As a result you have in that folder all needed Qt DLLs. Of course you can have also issues with MSVC redistributables, but those should be deployed separately and installed once per system.

The tool windeployqt has various options. It can also take care about deployment of qml related files.

Only some 3rd party libraries should be copied manually if they are used, for example OpenSSL.



回答2:

Solution:

As I got deeper, I have found this answer, after doing what that answer indicates (I actually copied all the .DLLs located in \Qt5.5.0\5.5\msvc2013\bin to the folder where my .exe is located), the error message changed from The application was unable to start correctly (0xc000007b) to Application failed to start because it could not find or load the QT platform plugin “windows”.

Searching on web for more about this error, I have found from this answer that you also need the platforms folder in the same location with the .exe (which was located in Qt5.5.0\5.5\msvc2013\plugins path). After copying that folder, the application started without any problems!!!

Now I just need to delete all unnecessary .DLLs from my application folder (Dependency Walker does not offer very useful information about this), and all the deployment is done.

I have solved the problem in the same time as describing it, so I guess I will just leave this here, may help others that have the same problem.