問題引入
在使用qmake構建項目時,經常有不同的預處理選項,需要在預處理期間將代碼區分開。另外還有一些情況下需要在編譯時使用不同的編譯選項將待編譯的文件區分開。看下面一個例子。
該項目下包含:aaa.h、aaa.cpp、bbb.h、bbb.cpp、main.cpp五個文件,內容分別如下:
aaa.h
1 #ifndef AAA_H_ 2 #define AAA_H_ 3 4 void test(int val); 5 6 #endif
aaa.cpp
1 #include "aaa.h" 2 #include <iostream> 3 4 void test(int val) 5 { 6 std::cout << "AAA::test " << val << std::endl; 7 }
bbb.h
#ifndef BBB_H_ #define BBB_H_ void test(int val); #endif
bbb.cpp
1 #include "bbb.h" 2 #include <iostream> 3 4 void test(int val) 5 { 6 std::cout << "BBB::test " << val << std::endl; 7 }
main.cpp
1 #include <iostream> 2 3 #ifdef USE_AAA 4 #include "aaa.h" 5 #else 6 #include "bbb.h" 7 #endif 8 9 int main(int argc, char* argv[]) 10 { 11 #ifdef USE_AAA 12 std::cout << "USE_AAA" << std::endl; 13 test(123); 14 #else 15 std::cout << "NO USE_AAA" << std::endl; 16 test(123); 17 #endif 18 }
解決方案
現在想要通過在編譯時指定USE_AAA實現不同選項的區別編譯。因此,可以這樣寫pro文件:
1 TEMPLATE = app 2 TARGET = testpro 3 INCLUDEPATH += . 4 5 DEFINES += QT_DEPRECATED_WARNINGS 6 7 #HEADERS += \ 8 # aaa.h \ 9 # bbb.h 10 11 if(contains(DEFINES, USE_AAA)) { 12 HEADERS += aaa.h 13 }else{ 14 HEADERS += bbb.h 15 } 16 17 SOURCES += \ 18 # aaa.cpp \ 19 # bbb.cpp \ 20 main.cpp 21 22 if(contains(DEFINES, USE_AAA)) { 23 SOURCES += aaa.cpp 24 }else{ 25 SOURCES += bbb.cpp 26 }
直接使用qmake構建項目
qmake
運行結果如下
NO USE_AAA BBB::test 123
使用編譯選項
qmake DEFINES+=USE_AAA
運行結果如下:
USE_AAA AAA::test 123
總結
使用DEFINES選項可以達到效果,感興趣的可以觀察兩種情況下Makefile的區別。另外,需特別注意pro文件中條件語句的寫法,左花括號需要與條件語句位於同一行,這個切忌不要搞錯了。