[solved]Problem of deploying QT application on windows
-
Hi there,
I am now facing problem of deploying QT application on windows. I want to deploy the application by using shared libraries approach with manifest files.
I did the steps by following this doc: http://doc.qt.nokia.com/4.6/deployment-windows.html. And it worked on most of the computers that without Qt and
msvc redistribute. But one the computer failed to start the program. From the depends analysis, it says "...QtCore4.dll contains error...140001"My environment: Qt 4.6.2 and msvc 2005 with sp1, win 7; target computer: win 7 /win xp
Install the msvc redist 2005 would fix that problem, but that's the limitation, customers may not have the privilege to install redist. I need a standalone, side by side application
following is the directory structure:
app.exe.manifest
app.exe
qtcore4.dll
qtgui4.dll
Microsoft.VC80.CRT.manifest
msvcm80.dll
msvcp80.dll
msvcr80.dllOne more thing about depends tool, when I check the modules that qtcore4.dll depends, it always looks for the x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927 which is the latest vc80 dll on my computer. But the manifest file embedded in that dll specifies the crt version to: name="Microsoft.VC80.CRT" version="8.0.50727.762", and I have both versions on winsxs directory.
I also did some changes to the app.exe.manifest file by removing the publictoken element, because some article says without that, the sxs manager will try to locate the dll from current path. now the manifest looks like:
@<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly >
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>@Did anyone encounter this before? Any clue would be appreciated!
-J-
-
I don't have a solution for the redist problem. We require it to be installed on every client machine (in fact we put the exe into our installer and run it from there). It might be possible to put the DLLs besides the exe (or in a directory besides the exe), Microsoft at least states so in its docs, but it never worked out reliably for us. They wanted to solve the DLL hell and created the manifest fiasco...
Regarding the depends tool: The manifest contains the minimum version of the DLLs. The system loads the most recent version that matches the patch number. In your case this means: The most recent version 8.0.50727.xxx with xxx >= 762. Along the time you will end up with a whole bunch of SxS directories, as many applications bring their own redistributables with them.
-
Thanks for reply, Volker and dialingo.
After hours fighting against that problem, here comes up with a solution. I turned off the "embedded manifest" option recompiled the Qt dlls from MSVC. I guess putting this line: CONFIG-=embed_manifest_dll in the .pro file will work as well. Now each Qt dll has its manifest outside, file structure becomes:
app.exe.manifest
app.exe
qtcore4.dll.manifest
qtcore4.dll
qtgui4.dll.manifest
qtgui4.dll
Microsoft.VC80.CRT.manifest
msvcm80.dll
msvcp80.dll
msvcr80.dllFrom the depends view, when Qt dll looks for MSVC dll, the dlls in current directory will be considered firstly. And the application could be launched from that machine without Qt or vcredist installed.