2013-08-22 12 views
6

Chciałbym utworzyć plik projektu, który będzie działać zarówno z msvc i gcc.qmake: opcje obsługi zarówno gcc, jak i msvc

Aby zoptymalizować pod kątem szybkości, należy wykonać cl /O2 i g++ -O3.

Ale nie wiem, jak rozpoznać plik projektu, żeby zrobić różnicę. Chciałbym coś takiego:

msvc:QMAKE_CXXFLAGS_RELEASE += /O2 /openmp /arch:AVX 
else:QMAKE_CXXFLAGS_RELEASE += -O3 -march=native -fopenmp -D_GLIBCXX_PARALLEL 

co nie działa niestety.

Innym sposobem jest zmiana mkspecs i powiązanie nowych z moją aplikacją, ale nie jest zbyt przenośna. Dzięki!

+0

czym polega problem? Co masz na myśli mówiąc "to nie działa niestety"? – Bill

+0

Czy próbowałeś używać zakresu jak 'win32' i'! Win32' jak opisano w dokumentacji? http://qt-project.org/doc/qt-4.8/qmake-advanced-usage.html –

+0

Jeśli dodaję kod, który umieściłem wcześniej w moim pliku projektu, nadal będę miał: 'cl -O3 -march = native -fopenmp -D_GLIBCXX_PARALLEL', podczas gdy ja chcę 'cl/O2/openmp/arch: AVX' –

Odpowiedz

8

Jean, aby być precyzyjnym, należy użyć w oparciu o ten opis:

msvc:QMAKE_CXXFLAGS_RELEASE += /O2 /openmp /arch:AVX 
gcc:QMAKE_CXXFLAGS_RELEASE += -O3 -march=native -fopenmp -D_GLIBCXX_PARALLEL 
+1

w prawo! Czy istnieje gdzieś lista kompilatora? Jakby pewnego dnia chciałbym użyć klang? (nawet jeśli myślę, że opcje są kompatybilne z gcc, prawda?) –

+0

@ Jean-MichaëlCelerier: Tak, masz rację: Przynajmniej na razie Clang próbuje mieć opcje kompatybilne z gcc, więc nie powinno być żadnych problemy, o ile nie korzystasz z żadnych egzotycznych opcji ...;) – mozzbozz

+0

@ Jean-MichaëlCelerier: I według twojego pierwszego pytania: Szukałem listy zakresów kompilacji dla qmake teraz przez kilka minut (też tego potrzebowałem), ale nie mogłem nic znaleźć:/ale przez próbę -i-error Stwierdziłem, że MinGW jest po prostu "mingw" (tak samo jak "gcc" i "msvc" -> łatwe do odgadnięcia); Więc dla clanga jestem całkiem pewny, że to "clang";) EDYCJA: To może pomóc: http://stackoverflow.com/questions/14523148/compiler-scope-values-in-qmake – mozzbozz

0

Oto plik projektu, z którego korzystałem. Działa na Windows (msvc) i Linux (GCC)

QT = core gui widgets 

HEADERS += \ 
    render.h 

SOURCES += \ 
    main.cpp \ 
    render.cpp 

QMAKE_CXXFLAGS_RELEASE -= -O 
QMAKE_CXXFLAGS_RELEASE -= -O1 
QMAKE_CXXFLAGS_RELEASE -= -O2 

win32 { # For Windows 
    QMAKE_CXXFLAGS += -openmp 
    QMAKE_CXXFLAGS += -arch:AVX 
    QMAKE_CXXFLAGS += -D "_CRT_SECURE_NO_WARNINGS" 
    QMAKE_CXXFLAGS_RELEASE *= -O2 
} 

linux { # For Linux 
    QMAKE_CXXFLAGS += -fopenmp 
    QMAKE_LFLAGS += -fopenmp 
    QMAKE_CXXFLAGS += -mavx 
    QMAKE_CXXFLAGS_RELEASE *= -O3 
} 
+0

Hmm, jak to jest lepsze niż oryginalny post? Ponadto nie potrzebujesz core i gui dla zmiennej QT. Są one uwzględnione domyślnie! – lpapp

+0

Cóż, dla jednego OP powiedział, że jego stanowisko nie działa. Chyba nie było problemu. Ale spróbowałem twojego przykładu. Nie działa mi. Muszę dodać do GCC 'QMAKE_LFLAGS + = -fopenmp' w przeciwnym razie dostanę masę błędów linkera (' error: undefined reference to omp_get_num_threads' i tak dalej). –

+0

Problem z tą odpowiedzią jest taki, że nie można go użyć do rozróżnienia między MinGW a MSVC, na przykład ... – mozzbozz

Powiązane problemy