VS 2008 moc datei immer wieder erstellt!

Alles rund um die Programmierung mit Qt
Antworten
Bugi
Beiträge: 10
Registriert: 15. Oktober 2009 11:06
Kontaktdaten:

VS 2008 moc datei immer wieder erstellt!

Beitrag von Bugi »

Hallo,

ich habe ein Qt Projekt, was ich in VS 2008 entwickle. Soweit funktioniert alles prima. Aber mit der zuwachsenden Projektgröße dauert der Kompiliervorgang länger. Mir ist es aufgefallen, dass beim Erstellen des Projektes jedes mal die mocs neu erstellt werden, obwohl ich in header Dateien überhaupt nix geändert hatte.

Kann man das irgendwo einstellen, dass VS die mocs nur dann erstellt, wenn es in header Datei was geändert wird?

Vielen Dank im Voraus!
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Beitrag von Troll.Soft »

VC kann alles neu kompilieren oder nur geändertes. Je nachdem was Du von ihm verlangst. Im Pro-File von Qt kann man das nicht steuern. Aber Du kannst im Pro-File precompiled-header nutzen einstellen. Das drückt die Compiledauer erheblich.
tschüß
Troll.Soft
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Beitrag von brax »

Das ist kein VS Problem, normalerweise werden die MOCs nur neu erstellt, wenn sich der Header geändert hat.
Welche QT Version benutzt Du? Ich glaube bei 4.5.2 hatte ich das gleiche Problem. Meine Lösung sah so aus:
In %QTDIR%/makespecs/features/ die Datei moc.prf öffnen. Dort die Zeilen
!isEmpty(INCLUDETEMP):moc_header.depends += $$INCLUDETEMP
und
!isEmpty(INCLUDETEMP):moc_source.depends += $$INCLUDETEMP
auskommentieren (mit '#'). Bei mir waren es die Zeilen 68 und 80.
Danach ein qmake und dann sollte wieder alles gut funktionieren.

War (bei mir) ab 4.5.3 nicht mehr notwendig. Solltest Dies wirklich Dein Problem sein, empfehle ich dringend eine andere QT Version zu benutzen (auch nach der obigen Änderung hatte ich hier und da noch ein paar Probleme mit 4.5.2 und dem Bauprozess).
Viel Erfolg!
Bugi
Beiträge: 10
Registriert: 15. Oktober 2009 11:06
Kontaktdaten:

Beitrag von Bugi »

Hallo,

wie sieht es denn aus wenn man qmake nicht benutzt? Aktuell verwende ich die Qt 4.6.2 mit VS2008. Da ich neben Qt auch andere Libs verwende, habe ich bisher qmake noch nie eingebunden und auch nicht benötigt.

Leider weiß ich nicht wie man dem benutzerdefiniertem Buildbefehl klarmachen kann, dass er den moc nur ausführt, wenn sich am Header was geändert hat ?

Danke für die Antworten!
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Beitrag von brax »

Die Benutzung anderer Libs schließt nicht aus, dass Du Deine VS Projektdateien von qmake erzeugen lässt, aber das nur am Rande.

Ich bin mir nicht sicher, wie beim VS die CustomBuildSteps am Besten konfiguriert sind. Ich paste mal einen Teil einer von qmake generierten .vcproj Datei von mir, vielleicht hilft Dir das ja....

Code: Alles auswählen

<File
					RelativePath="common\myHeader.h"
					>
					<FileConfiguration
						Name="Debug|Win32"
						>
						<Tool
							Name="VCCustomBuildTool"
							Description="MOC common\myHeader.h"
							CommandLine="C:\opt\x86\qt\4.6.2\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DFFRAMEWORK -DCYGWINNT-6.0-WOW64 -DCYGWIN_NT-6.0-WOW64_i386 -DDEBUG -D_WIN32 -DGITTIMESTAMP=\"Mon_May_31_10:28:02_2010_+0200\" -DNOMINMAX -DWORKSTATIONARCH=\"CYGWIN_NT-6.0-WOW64.i386\"  -DFTGL_LIBRARY_STATIC -DHAVE_QCA -DHAVE_LIBQWEBDAV -D_USE_MATH_DEFINES -DHAVE_FOC -DHAVE_TNT -DTNT_SUBSCRIPT_TYPE=unsigned -DTNT_BOUNDS_CHECK -DQT_DLL -DQT_SQL_LIB -DQT_XML_LIB -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"c:\opt\x86\qt\4.6.2\include\QtCore" -I"c:\opt\x86\qt\4.6.2\include\QtNetwork" -I"c:\opt\x86\qt\4.6.2\include\QtGui" -I"c:\opt\x86\qt\4.6.2\include\QtOpenGL" -I"c:\opt\x86\qt\4.6.2\include\QtXml" -I"c:\opt\x86\qt\4.6.2\include\QtSql" -I"c:\opt\x86\qt\4.6.2\include"  -I"-I"c:\opt\x86\qt\4.6.2\include\ActiveQt" -I"obj\moc.win32d" -Ic:\opt\x86\qt\4.6.2\mkspecs\win32-msvc2008 -D_MSC_VER=1500 -DWIN32 common\myHeader.h -o obj\moc.win32d\moc_myHeader.cpp&#x0D;&#x0A;"
							AdditionalDependencies="C:\opt\x86\qt\4.6.2\bin\moc.exe;common\myHeader.h"
							Outputs="obj\moc.win32d\moc_myHeader.cpp"
						/>
					</FileConfiguration>
				</File>
Ist zugegebenermaßen etwas unübersichtlich....
Viel Erfolg
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Beitrag von Troll.Soft »

brax hat geschrieben:Die Benutzung anderer Libs schließt nicht aus, dass Du Deine VS Projektdateien von qmake erzeugen lässt, aber das nur am Rande.
Finde ich durchaus wichtig und vor allem sehr praktisch. Die Files für qmake sind ausgesprochen übersichtlich. Hier ist ein Beispiel:

Code: Alles auswählen

QT	+= core
QT	+= gui
QT	+= xml
QT	+= svg
QT	+= sql
QT	+= network
QT	+= webkit

CONFIG	+= qt
CONFIG	+= warn_on
CONFIG	+= exceptions
CONFIG	+= rtti
CONFIG	+= debug 

PRECOMPILED_HEADER  = my_precompiled_header.h	

TEMPLATE    = vcapp

MOC_DIR	    = moc
DESTDIR     = debug.WINDOWS
OBJECTS_DIR = debug.WINDOWS

LIBS       += ../../fremdeLib1.lib
LIBS       += ../../../../fremdeLib2.lib


SOURCES     = source/main.cpp
SOURCES    += source/source_1.cpp
SOURCES    += source/source_2.cpp
	...
SOURCES    += source/source_n.cpp


HEADERS     = include/header_1.h
HEADERS    += include/header_2.h
	...
HEADERS    += include/header_n.h


TARGET      = main
sieht irgendwie übersichtlich und selbsterklärend aus.
Die moc werden nur einmal angelegt und compiliert, die header auch nur einmal compiliert. Nur die Source an der Du aktuell sitzt wird compiliert.
tschüß
Troll.Soft
Antworten