不使用 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 .hpp
10.
11.  QTCOMPILE_FILES = $(QTTMP_PATH)ui_test_window.hpp \
12.                    $(QTTMP_PATH)qrc_resource.hpp \
13.                    $(QTTMP_PATH)moc_window.hpp
14.  OBJ_FILES       = main.o
15.
16.  all: QtTest
17.  QtTest : $(QTCOMPILE_FILES) $(OBJ_FILES)
18.          g++ $(LIB_PATH) -o $@ $(OBJ_FILES) $(QTLIBS)
19.
20.  .cpp.o:
21.          g++ $(INC_PATH) -c $<
22.
23.  $(QTTMP_PATH)moc_%.hpp : %.hxx
24.          moc $< -o $@
25.
26.  $(QTTMP_PATH)qrc_%.hpp : %.qrc
27.          rcc $< -o $@
28.
29.  $(QTTMP_PATH)ui_%.hpp: %.ui
30.          uic $< -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)裡的檔案都刪除。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.