不使用 qmake 建置 Qt Designer 產生的程式:GNU Make

前一篇《不使用 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) -c

amp;lt;22. 23. $(QTTMP_PATH)moc_%.hpp : %.hxx24. moc

amp;lt; -o $@25. 26. $(QTTMP_PATH)qrc_%.hpp : %.qrc27. rcc

amp;lt; -o $@28. 29. $(QTTMP_PATH)ui_%.hpp: %.ui30. uic

amp;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)裡的檔案都刪除。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *