Seite 1 von 1

[gelöst] qmake, nmake und Windows 7

Verfasst: 17. Januar 2009 17:54
von Strayer
Hallihallo,

ich teste gerade gerade die aktuelle Beta von Windows 7 und bin dabei auf ein interessantes Problem gestoßen...

Wenn ich mit Visual Studio 2007 Express versuche über die Kommandozeile Qt Programme zu compilen erhalte ich diesen Fehler:

Code: Alles auswählen

link /LIBPATH:"e:\Entwicklung\lib\qt-4.4.3\lib" /LIBPATH:"e:\Entwicklung
\lib\qt-4.4.3\lib" /NOLOGO /INCREMENTAL:NO /MANIFEST /MANIFESTFILE:"tmp\obj\rele
ase_shared\t1.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:typ
e='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyTo
ken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:release\t1.e
xe @C:\Users\Strayer\AppData\Local\Temp\nmC6FD.tmp
        mt.exe -nologo -manifest "tmp\obj\release_shared\t1.intermediate.manifes
t" -outputresource:release\t1.exe;1

mt.exe : general error c101008d: Failed to write the updated manifest to the res
ource of file "release\t1.exe". The binary is not a valid Windows image.
NMAKE : fatal error U1077: ""C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\m
t.exe"": Rückgabe-Code "0x1f"
Stop.
NMAKE : fatal error U1077: ""C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN
\nmake.exe"": Rückgabe-Code "0x2"
Stop.
Wenn ich jedoch mit qmake -tp vc eine vcproj Datei erstelle und das Programm im VS kompiliere, startet es ohne Probleme.
Ich denke also mal, dass es an der generierten Makefile liegt, aber meine Kentnisse haben was das anbelangt ziemliche Grenzen.

Hat da jemand eine Idee?

Makefile
Makefile.Debug

Nachtrag:
Normales compilen über die Kommandozeile funktioniert ohne Probleme.

Code: Alles auswählen

E:\Entwicklung\wmi_cpp>cl ipzeug.cpp
Microsoft (R) 32-Bit C/C++-Optimierungscompiler Version 15.00.30729.01 für 80x86

Copyright (C) Microsoft Corporation.  All rights reserved.

ipzeug.cpp
C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C
4530: C++-Handler verwendet, aber Entladesemantik ist nicht aktiviert. Geben Sie
 /EHsc an.
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:ipzeug.exe
ipzeug.obj

E:\Entwicklung\wmi_cpp>ipzeug
Connected to ROOT\CIMV2 WMI namespace
IP Count: 2
IP 0: 192.168.1.23
IP 1: fe80::f55f:e839:6506:c899

E:\Entwicklung\wmi_cpp>

Verfasst: 17. Januar 2009 18:39
von Christian81
Standard-Problem von mt.exe. Benutze eine ntfs-Partition da passiert das kaum/sehr selten.
Suche einfach mal nach c101008d und mt.exe bei google und beschwer Dich bei M$ :)

Verfasst: 18. Januar 2009 15:09
von Strayer
Das habe ich natürlich schon vorher getan ;) Leider haben die meisten nur das Problem, dass gerade ein anderer Prozess auf die betreffende Datei zugreift (Virenscanner, etc.)

Bei mir wird tatsächlich keine win32 binary erstellt.
Eigentlich sollte die *.exe nach dem linken auch ohne manifest ja zumindest startbar sein, bei mir kommt aber nur das bei rum:
Bild

Verfasst: 18. Januar 2009 20:30
von Christian81
Wie gesagt - das ist kein Qt Problem sondern liegt an mt.exe. Seitdem ich auf NTFS umgestiegen bin habe ich das Problem nicht mehr (und einen Virenscanner benutz ich nicht, also kann es nicht daran gelegen haben).

Verfasst: 18. Januar 2009 20:59
von Strayer
Aber ein Programm welches mit Visual Studio kompiliert wurde sollte doch auch ohne manifest startbar sein, daher muss das Problem doch schon VOR der mt.exe auftreten?

Windows 7 Beta Patch vor mt.exe Problem

Verfasst: 12. Februar 2009 12:56
von erni
Ich habe in qtforum.org einen Patch/Workarround für das Problem von mt.exe veröffentlich. Im Prinzip muss nur dafür gesorgt werden, dass mt.exe nur auf Dateien angewandt wird, die eine Resource-Section enthalten. Das wird erreicht indem beim Linken immer eine "leere" Resource-Datei gelinkt wird.

Verfasst: 12. Februar 2009 14:25
von Strayer
In der Mailingliste hat mir Thiago Macieira folgendes geschrieben:
Windows 7 is not supported. Microsoft broke manifests again and we've only
started looking into the issue.

Please see http://doc.trolltech.com/main-snapshot/ ... ssues.html for
more information.
Der workaround dort funktioniert auch halbwegs, nur überschreibt der blöderweise ALLE Resourcendateien (designer.exe hat kein icon, etc.)
Inzwischen hab ich mich aber schon damit abgefunden und kompiliere erstmal wieder nur unter Vista. ;)

Verfasst: 12. Februar 2009 15:20
von erni
Huch, ich habe Icons am Designer...
Mein Ansatz hat diese Problem nicht, da ich zusätzliche Resource-Dateien generiere, und über die embed_manifest_exe.prf regele.

Ich habe zum Bauen

Code: Alles auswählen

configure -debug-and-release -no-dsp -no-vcproj -no-plugin-manifests -prefix c:\local\qt4.5\x64
verwendet.
Als Compiler habe ich den 64bit Compiler aus dem "Microsoft SDK für Windows 7 Beta" verwendet. Wichtig ist Plugin-DLL keine Manifesten zu verwenden, ansonsten kann man die Microsoft-Runtime-Dll's nicht Side by Side installieren, sondern muss das Redist installieren.

Hier nochmal mein Patch:

Code: Alles auswählen

*** mkspecs\features\win32\embed_manifest_exe.prf.orig	Sun Jan 04 16:14:54 2009
--- mkspecs\features\win32\embed_manifest_exe.prf	Sat Feb 07 19:23:06 2009
***************
*** 3,11 ****
      NOPATH_TARGET ~= s,\\ , ,q      # Remove space escaping (NOPATH_TARGET is quoted)
      NOPATH_TARGET ~= s,\\,/,g       # Change to single type separators
      NOPATH_TARGET ~= s,^(.*/)+,,    # Remove all paths
!     QMAKE_LFLAGS += /MANIFEST $$quote(/MANIFESTFILE:\"$${OBJECTS_DIR}\\$${NOPATH_TARGET}.intermediate.manifest\")
      QMAKE_PREV_POST_LINK = $$QMAKE_POST_LINK
      QMAKE_POST_LINK = $$quote(mt.exe -nologo -manifest \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" -outputresource:$(DESTDIR_TARGET);1$$escape_expand(\n\t))
      QMAKE_POST_LINK += $$QMAKE_PREV_POST_LINK
!     QMAKE_CLEAN += \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\"
  }
--- 3,14 ----
      NOPATH_TARGET ~= s,\\ , ,q      # Remove space escaping (NOPATH_TARGET is quoted)
      NOPATH_TARGET ~= s,\\,/,g       # Change to single type separators
      NOPATH_TARGET ~= s,^(.*/)+,,    # Remove all paths
!     QMAKE_LFLAGS += \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}-dummy.res\" /MANIFEST $$quote(/MANIFESTFILE:\"$${OBJECTS_DIR}\\$${NOPATH_TARGET}.intermediate.manifest\")
      QMAKE_PREV_POST_LINK = $$QMAKE_POST_LINK
+     QMAKE_PREV_PRE_LINK = $$QMAKE_PRE_LINK
+     QMAKE_PRE_LINK = $$quote(echo.>\"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}-dummy.rc\" && rc.exe /fo \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}-dummy.res\" \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}-dummy.rc\" $$escape_expand(\n\t))
      QMAKE_POST_LINK = $$quote(mt.exe -nologo -manifest \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" -outputresource:$(DESTDIR_TARGET);1$$escape_expand(\n\t))
      QMAKE_POST_LINK += $$QMAKE_PREV_POST_LINK
!     QMAKE_PRE_LINK += $$QMAKE_PREV_PRE_LINK
!     QMAKE_CLEAN += \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" "$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}-dummy.rc\" "$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}-dummy.res\"
  }

Verfasst: 12. Februar 2009 15:38
von Strayer
erni hat geschrieben:Huch, ich habe Icons am Designer...
Mein Ansatz hat diese Problem nicht, da ich zusätzliche Resource-Dateien generiere, und über die embed_manifest_exe.prf regele.
Hmm, jetzt reizt es mich doch glatt nochmal die Windows 7 Beta zu installieren...
erni hat geschrieben:Als Compiler habe ich den 64bit Compiler aus dem "Microsoft SDK für Windows 7 Beta" verwendet.
Benutzt du das SDK mit der Express Variante oder mit dem "richtigen" Visual Studio? Würde mich wegen dem 64bit Compiler interessieren.
erni hat geschrieben:Wichtig ist Plugin-DLL keine Manifesten zu verwenden, ansonsten kann man die Microsoft-Runtime-Dll's nicht Side by Side installieren, sondern muss das Redist installieren.
Jap, das mache ich inzwischen auch so, hat mir vorher einiges an Kopfschmerzen bereitet...

Danke für den Code, das werde ich mir direkt mal zwischenspeichern :)

Verfasst: 12. Februar 2009 15:56
von erni
Ich benutzte Visual Studio Express + Windows SDK für Windows 7 ;-)
Der Debugger für 64bit-Programme ist in der Express-Version enthalten und und im SDK sind die Standard-Compiler für 64Bit und 32bit.
Mit dem SDK für Windows 7 Beta bekommt du diese jetzt auch in der 2008 SP1 Variante.

Bernd

setvc9.bat

Code: Alles auswählen

@echo on
set VCPLATFORM=%1
if "%VCPLATFORM%" == "" set VCPLATFORM=32
call "%ProgramFiles(x86)%\Microsoft Visual Studio 9.0\VC\bin\vcvars%VCPLATFORM%" 
Verwenden mit

Code: Alles auswählen

setvc9 32

Code: Alles auswählen

setvc9 64