Sannhet 2.

Tilfeldige utviklingsnotater.

Egendefinerte byggregler for QT under Visual Studio 2010.

Denne hurtigveiledningen forklarer hvordan du konfigurerer Visual Studio 2010, hvordan du kan paberope forskjellige bygge kommandoer for filer i prosjektet. Det spesifikke malet her er a bygge alle Qt-metafilene sammen med din vanlige byggprosedyre.

Jeg vil vise hvordan du definerer et tilpasset byggverktoy for enkeltfiler, og hvordan du konfigurerer en tilpasset byggregel for et sett med filer i prosjektet ditt som samsvarer med bestemte kriterier.

Det har v rt endringer i VS 2010 om noen av de tilpassede tilpasningene, Visual Studio 2010 bruker MSBuild hele tiden.

Egendefinert byggeverktoy for enkeltfiler: Metaobjektkompilering & # 8211; MOC.

Alle filer som bruker Q_OBJECT-makroen, ma kompileres ved hjelp av Meta-Object Compiler (MOC). Her er det du gjor for a paberope moc.exe til som et tilpasset byggverktoy som er utfort for en gitt fil (for eksempel MainWindow.h):

Hoyreklikk elementet i losningsoppdageren.

Egenskaper – & gt; Konfigurasjonsegenskaper – & gt; Elementtype: Egendefinert byggeverktoy Klikk pa & # 8220; Bruk & # 8221 ;, en ny oppforing & # 8220; Egendefinert byggeverktoy & # 8221; skal vises til venstre, velg den oppforingen under kommandolinjen:

$ (QTDIR) \ bin \ moc.exe «% (FullPath)» -o «% (RootDir)% (Directory) moc _% (Filnavn) .cpp»

Samling% (Filnavn).% (Extension) ved hjelp av MOC.

Dette forutsetter at en global systemvariabel kalt QTDIR eksisterer som peker pa Qt-rotkatalogen. Hvis du na hoyreklikker pa elementet i losningsoppdageren, vil det gi et kompileringsalternativ for MainWindow.h. Den vil kompilere MainWindow.h ved hjelp av moc.exe for a opprette moc_MainWindow.cpp.

Sjekk denne listen for en oversikt over hvilke bygningsvariabler (elementmetadata) for a referere til gjeldende element.

Nar du angir egendefinerte byggverktoy for enkeltfiler, trenger du ikke a bruke variabler, men kan i stedet gi hele filbanen direkte. Hvis du har flere filer som skal bruke det samme byggeverktoyet, kan du na enkelt kopiere og lime over utklipp og det vil fungere for en slik fil.

A legge til egendefinert byggeverktoy til alle filer i prosjektet ditt ved hjelp av Q_OBJECT, kan v re kjedelig. V r imidlertid oppmerksom pa at du kan velge flere filer i Solution Explorer (CTRL + klikk) og angi det egendefinerte byggeverktoyet for alle dem (hoyreklikk, Egenskaper, Alle konfigurasjoner, samme trinn som ovenfor).

Du kan ogsa sette opp en egendefinert byggeregel / bygge tilpasning som nevnt for * .ui og * .qrc-filer nedenfor. Men siden vanligvis ikke alle overskrifter i et Qt-prosjekt bruker Q_OBJECT-makroen moc.exe ville kjore og mislykkes for disse overskriftene. Byggregelen kan imidlertid justeres for a sjekke om Q_OBJECT er til stede i filene.

Tilpasset byggeregel for flere filer i prosjektet: * .ui bruker uic og * .qrc ved hjelp av rcc.

Du bor bruke tilpassede byggregler nar et sett med filer som samsvarer med bestemte kriterier, skal ha en tilpasset konstruksjon. Slik konfigurerer du en tilpasset byggregel for alle filer i prosjektet ditt som samsvarer med * .ui-monsteret:

1. Definer den faktiske byggregelen i en .target-fil.

Opprett en fil med et passende navn, f.eks. BuildRuleQt_ui.targets og lagre det pa et sted der du kan bruke det pa nytt.

Denne byggregelen definerer hvilke elementer som skal behandles i ItemGroup-taggen. Den inneholder alle filer som skal behandles, som ligger under prosjektkatalogen og samsvarer med * .ui-monsteret. Det vil rekursivt inkludere alle matchende filer i alle underkataloger. Navnet som hvert element i kan henvises til i dette tilfellet, er UIFiles, du kan velge noe du liker.

Deretter definerer det faktiske byggemalet innganger og oppgavene som skal utfores.

Direktivet BeforeTargets angir at det skal lope for det faktiske kompilere malet utfores. For hvert behandlet element skrives en melding ut, og den faktiske UIC-samlingen blir pakalt.

Merk igjen at QTDIR er en miljovariabel.

2. Inkluder byggregelen i byggingen din.

Hoyreklikk prosjektet ditt, velg & # 8220; Build Custumizations & # 8230; & # 8221 ;, & # 8220; Finn eksisterende & # 8230; & # 8221;

Sok etter XML-filen som er opprettet ovenfor, og kontroller at den er merket i listen over & # 8220; Tilgjengelige bygg tilpassingsfiler & # 8221 ;.

Hvis du bygger prosjektet na, bor du * .ui-filene dine kompileres ved hjelp av UIC.exe.

3. Aktiver inkrementelle bygg.

Ved a fortelle MSBuild om utgangspostene, kan det avgjore hvilke elementer i settet som allerede er oppdatert, og for hvilke oppgaver ma utfores (se Incremental Builds). Endre mal i XML-byggefilen som folger (se Output-egenskapen i Target-taggen):

Syntaxen som brukes her virker litt uklar, men tillater a referere til metadataegenskapene til alle elementene i et sett samlet.

Nar du bygger na, bor du motta varsel nar alle eller noen filer i utdataelementet er allerede oppdaterte.

Se denne artikkelen for noen flere MSBuild gotchas.

Ressursfilsamling & # 8211; RCC.

For dine * .qrc ressursfiler kan du gjore stort sett det samme som ovenfor, og bare endre regelen for a paberope rcc pa alle * .qrc-elementer.

Du kan bruke en ny. Target-fil eller ved a utvide den som ble opprettet tidligere.

Dele denne:

Post navigasjon.

Legg igjen et svar Avbryt svar.

Takk for at du postet dette, og det er super nyttig. Det eneste gjenv rende sporsmalet jeg har, er hvordan man handterer .cpp-filer generert fra MOC? De trenger fortsatt a bli kompilert og koblet som en del av & # 8220; build & # 8221; sa langt som Visual Studio er bekymret.

Du ma legge til de genererte cpp-filene til prosjektet ditt.

Tok deg. Jeg la ogsa merke til at noen av Qt-eksemplene direkte inneholder MOC-generert .cc eller .cpp-fil nederst pa den tilsvarende .cpp-motparten. Jeg antar at det er en annen levedyktig mate a gjore det pa. Takk igjen.

Dette er sott (gamle ting) Jeg haper noen leser dette.

Har du innsett at vi ma sende Preprocessor ting som -DADD_DEBUG_STUFF -DSOME_OTHER_STUFF -I & # 8221; .. \ include \ someinclude.h & # 8221; .

Bare det jeg lette etter. Takk!

Tusen takk for hjelpen . Jeg follwed hver spet over,

Men jeg har fortsatt et problem, men jeg vet ikke hva som er. Vennligst hjelp.

Etter byggingen kom denne meldingen fram:

moc_MainWindow.obj: feil LNK2019: eksternt symbol & # 8220; privat: void __thiscall MainWindow :: avslutt (tom) & # 8221; (? avslutte @ MainWindow @@ AAEXXZ) sin resolver al que se hace referencia en la funcion & # 8220; privat: static void __cdecl MainWindow :: qt_static_metacall (klasse QObject *, enum QMetaObject :: Ring, int, void * *) # 8221; (? Qt_static_metacall @ MainWindow @@ CAXPAVQObject @@ W4Call @ QMetaObject @@ HPAPAX @ Z)

Koden er veldig enkel: MainWindow.h er.

klasse MainWindow: offentlig QMainWindow.

quitButton = ny QPushButton (& # 8220; Quit & # 8221 ;, dette);

dette-> koble (quitButton, SIGNAL (klikket ()), dette, SLOT (avslutte ()));

Jubel ! Takk for hjelpen !

Jeg fant problemet alene, det var veldig enkelt, jeg overlot ikke metoden ();

Jeg skrev verktoy for moc basert pa denne bloggen, postet her: