前一篇《不使用 qmake 建置 Qt Designer 產生的程式:手動建置》基本上已經講了要怎樣手動建置一個 Qt 的應用程式了;而這一篇,則是來寫一個 Qt 應用程式的 GNU Make(參考:維基百科)的 Makefile 了∼
這邊同樣是使用上次那個 QtTest 的範例。而對應的 Makefile,由於 Heresy 個人對於 Makefile 的撰寫沒有很深的研究,在弄了很久之後,最後是寫成下面的形式:
1. QTTMP_PATH = ./generated/ 2. INC_PATH = -I. 3. -I$(QTTMP_PATH) 4. -I/usr/include/qt4 5. LIB_PATH = -L/usr/lib/qt4 6. QTLIBS = -lQtCore -lQtGui -lQtOpenGL 7. 8. .SUFFIXES: 9. .SUFFIXES: .cpp .o .hxx .qrc .ui .hpp10. 11. QTCOMPILE_FILES = $(QTTMP_PATH)ui_test_window.hpp 12. $(QTTMP_PATH)qrc_resource.hpp 13. $(QTTMP_PATH)moc_window.hpp14. OBJ_FILES = main.o15. 16. all: QtTest17. QtTest : $(QTCOMPILE_FILES) $(OBJ_FILES)18. g $(LIB_PATH) -o $@ $(OBJ_FILES) $(QTLIBS)19. 20. .cpp.o:21. g $(INC_PATH) -camp;lt;22. 23. $(QTTMP_PATH)moc_%.hpp : %.hxx24. mocamp;lt; -o $@25. 26. $(QTTMP_PATH)qrc_%.hpp : %.qrc27. rccamp;lt; -o $@28. 29. $(QTTMP_PATH)ui_%.hpp: %.ui30. uicamp;lt; -o $@31. 32. clean:33. rm $(QTTMP_PATH)*34. rm *.o $(TARGET)
Heresy 不確定這樣是不是最好的寫法,但是至少在 Heresy 這裡,都是可以用的;而也由於考慮到修改的方便性、擴充性,有不少東西都是定義成變數的形式。當然,也還有更多的東西也都可以變數化,這點就是視個人需要做調整了∼
在這個例子裡,首先是先定義了「QTTMP_PATH」這個變數,用來當作存放產生出來的檔案路徑(第一行);Heresy 是設定讓這些要使用 MOC、UIC、QRC 產生的檔案,都放在 ./generated/ 的目錄下,以方便管理、同時以及避免混淆。
接下來則是定義了 QTCOMPILE_FILES、用來窮舉會產生出來的檔案(第 11 – 13 行);這邊這個例子裡有 ui_test_window.hpp、qrc_resource.hpp 和 moc_window.hpp 這三個檔案。當然,這些檔案前面都有加上檔案的路徑,也就是之前定義的 $(QTTMP_PATH)。
而在要建置出 QtTest 的條件裡(第 17 – 18 行),除了定義的 QTCOMPILE_FILES 外,也包含了一般 C 程式也會產生的 .o 檔;這邊是用 OBJ_FILES 來窮舉(第 14 行),不過在這個例子裡只會有一個 main.o 就是了。
接下來的 20-21 行,則是針對一般 .cpp 檔案的編譯指令,這邊沒有加什麼特別的編譯參數;23-24 則是針對 .hxx 的檔案,要使用 MOC 來編譯、26-27 是針對 .qrc 的檔案,要使用 RCC 來編譯、29-30 是針對 .ui 檔,使用 uic 來編譯。
這樣寫好後,基本上只要下 make 這個指令,他就會依序來針對指定的檔案,做對應的編譯動作了∼理論上,他會執行的指令應該會是:
uic test_window.ui -o generated/ui_test_window.hpp rcc resource.qrc -o generated/qrc_resource.hpp moc window.hxx -o generated/moc_window.hpp g -I. -I./generated/ -I/usr/include/qt4 -c main.cpp g -L/usr/lib/qt4 -o QtTest main.o -lQtCore -lQtGui -lQtOpenGL
最後產生的,就是「QtTest」這個可執行擋了∼
而如果是要 make clean 的話,這裡除了會把 .o 的物件檔以及最後的執行檔刪除外,也會把暫存目錄(QTTMP_PATH)裡的檔案都刪除。