[gelöst] qmake, nmake und Windows 7

Verschiedenes zu Qt
Antworten
Strayer
Beiträge: 12
Registriert: 11. November 2008 19:16

[gelöst] qmake, nmake und Windows 7

Beitrag 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>
Zuletzt geändert von Strayer am 12. Februar 2009 14:25, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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$ :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Strayer
Beiträge: 12
Registriert: 11. November 2008 19:16

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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).
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Strayer
Beiträge: 12
Registriert: 11. November 2008 19:16

Beitrag 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?
erni
Beiträge: 3
Registriert: 7. Februar 2009 19:39

Windows 7 Beta Patch vor mt.exe Problem

Beitrag 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.
Strayer
Beiträge: 12
Registriert: 11. November 2008 19:16

Beitrag 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. ;)
erni
Beiträge: 3
Registriert: 7. Februar 2009 19:39

Beitrag 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\"
  }
Strayer
Beiträge: 12
Registriert: 11. November 2008 19:16

Beitrag 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 :)
erni
Beiträge: 3
Registriert: 7. Februar 2009 19:39

Beitrag 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
Antworten