2013-06-06 17 views
31

Czytam jednak HERE, ale nadal nie rozumiem składni zmiennej qmake CONFIG. Na przykład, jeśli mam następujące ustawienia config w moich .pro file:qMake: Jak dokładnie qmake interpretuje składnię "CONFIG (debug, debug | release)

CONFIG(debug, debug|release) { 
    message("debug mode") 
}else { 
    message("release mode") 
} 

wtedy, gdy uruchomiony qmake dodaje będą wyświetlane na wyjście kompilacji w Qt Creator:

Project MESSAGE: debug mode 
Project MESSAGE: debug mode 
Project MESSAGE: release mode 

wiedząc, że buduję mój projekt w „trybie debugowania” , to moje pytania są następujące:

  • dlaczego nie wyświetla się tylko komunikat "Tryb debugowania"? i dlaczego nie wyświetlać go tylko raz?
  • Następnie, ponieważ buduję w "trybie debugowania", , dlaczego wyświetlany jest komunikat "Project MESSAGE: release mode"?
  • Dokładnie, co to znaczy: CONFIG (debug, debug | release)? Czy oznacza to, że należy wbudować tryb debugowania, a następnie ponownie utworzyć tryb debugowania i na koniec utworzyć tryb wydania? Wiem, że nawiasy "{}" oznaczają scope, ale w jaki sposób qmake interpretuje to, co znajduje się wewnątrz tych nawiasów "()"?

Odpowiedz

51

W artykule, z którym łączyłeś się, na samym początku mówi się, że plik projektu jest przetwarzany trzy razy. To powinno odpowiedzieć na twoje pierwsze pytanie; ponieważ jest przetwarzany trzy razy, twoja wiadomość() jest również wykonywana trzy razy. Dlaczego jest przetwarzany wiele razy? Ponieważ qmake nie buduje twojego projektu! Generuje tylko instrukcje kompilacji, które są następnie wykorzystywane do faktycznego budowania projektu. Aby wygenerować instrukcje kompilacji dla wszystkich możliwych konfiguracji, musi przetworzyć plik projektu wiele razy, jeden raz dla każdej konfiguracji.

Dla twojego drugiego pytania: twój projekt jest zbudowany tylko w trybie debugowania, jeśli to jest to, co wybrałeś, ale instrukcje kompilacji również są tworzone dla trybu zwolnienia, jak już wspomniano powyżej. Podczas używania "make" z mingw na przykład (zamiast Visual Studio), otrzymasz dwa pliki Makefile: Makefile.Release i Makefile.Debug. Kiedy generuje plik makefile wydania, wtedy jest drukowany "tryb wydania".

Wreszcie, ma wartość true, jeśli CONFIG zawiera "debug", ale nie "release", lub jeśli zawiera zarówno "debug" i "release", ale "release" nie pojawia się po ostatnim wystąpieniu "debugowania" . Na przykład można mieć to:

CONFIG += release debug release debug release debug 

Od ostatniego „debug” pochodzi od ostatniego „release”, CONFIG(debug, debug|release) jest prawdą.

Pierwszy argument CONFIG() ("debugowanie" w tym przypadku) jest wartością, która musi pojawić się jako ostatnia. Drugi argument ("debugowanie | wydania") to zestaw wartości, z którymi sprawdzany jest pierwszy argument.

Tłumaczenie tego na angielski dałoby coś takiego: należy ocenić na true, jeśli "debug" pojawi się co najmniej raz, a na wypadek, gdyby pojawiło się "release", pojawi się "debug" po ostatnim pojawieniu się "release" ".

+3

Dziękuję bardzo za odpowiedź, jest niezwykle ważna i pomocna. Jednak nie rozumiałem tej części "oceny oświadczenia".wspomniałeś, że "' CONFIG (debug, debug | release) 'zwraca wartość true, jeśli CONFIG zawiera debugowanie etc ...", co masz na myśli przez "zawiera"? masz na myśli zdefiniowane jak w 'CONFIG + = debug'? jeśli tak, biorąc pod uwagę, że nie mam takiej definicji w moim pliku '.pro', to gdzie znajduje się ta definicja? ... jeszcze jedno, zdefiniowałeś to również: 'CONFIG + = release debug release debug release release, co oznacza zdefiniowanie" debugowania "i" wydania "w ten sposób? – hashDefine

+0

proszę, wybaczcie też moje zbyt wiele pytań, ponieważ nie mogę znaleźć żadnego źródła internetowego, które to tłumaczy, nie wspominając o waszym wyjaśnieniu jest bardzo proste, zwięzłe i jasne. – hashDefine

+1

@hashDefine Qt Creator może dodać "release" do CONFIG podczas wywoływania qmake. Na przykład, jeśli wybierzesz "Uruchom qmake" w menu "Kompilacja" i ustawisz tryb kompilacji na zwolnienie, zobaczysz, że przekazuje "CONFIG + = release" jako argument do qmake. Ponieważ CONFIG może już zawierać "debugowanie" (albo dlatego, że umieściłeś to w pliku projektu samodzielnie, albo może pochodzić z pliku mkspec), musi istnieć sposób na przesłonięcie go. Dlatego istnieje zasada "pojawia się jako ostatnia w CONFIG". Przykład, który podałem, był właśnie taki; przykład. Nie ma sensu dodawać "uwolnienia" i "debugowania" do KONFIGURACJI. –

Powiązane problemy