在linux環(huán)境下進(jìn)行程序開(kāi)發(fā)時(shí),經(jīng)常需要使用makefile管理編譯代碼,特別是一些大型工程,而makefile工具語(yǔ)法晦澀深入研究較為困難,好在有很多工具可以自動(dòng)生成makefile,qmake就是其中的一種。
qmake特點(diǎn)
- 為不同的平臺(tái)的開(kāi)發(fā)項(xiàng)目創(chuàng)建makefile。
- 可以供給任何一個(gè)軟件項(xiàng)目使用,而不用管它是不是用Qt寫(xiě)的,盡管它包含了為支持Qt開(kāi)發(fā)所擁有的額外的特征。
- qmake基于一個(gè)項(xiàng)目文件這樣的信息來(lái)生成makefile。項(xiàng)目文件可以由開(kāi)發(fā)者生成。
- 不用修改項(xiàng)目文件,qmake也可以為Microsoft Visual Studio生成項(xiàng)目。
.pro文件說(shuō)明
注釋-#
TEMPLATE 模板
app - 建立一個(gè)應(yīng)用程序的makefile(默認(rèn)值)。
vcapp - 建立一個(gè)應(yīng)用程序的Visual Studio項(xiàng)目文件。
lib - 建立一個(gè)庫(kù)的makefile。
vclib - 建立一個(gè)庫(kù)的Visual Studio項(xiàng)目文件。
subdirs - 這是一個(gè)特殊的模板,它可以創(chuàng)建一個(gè)能夠進(jìn)入特定目錄,并且為一個(gè)項(xiàng)目文件生成。 makefile,并且為它調(diào)用make的makefile。app模板
使用該模板時(shí),下面這些qmake系統(tǒng)變量是被承認(rèn)的,在.pro文件中使用它們來(lái)為應(yīng)用程序指定特定信息。
TARGET - 可執(zhí)行應(yīng)用程序的名稱。
HEADERS - 應(yīng)用程序中的所有頭文件的列表。
SOURCES - 應(yīng)用程序中的所有源文件的列表。
DEFINES - 應(yīng)用程序所需的額外的預(yù)處理程序定義的列表。
DESTDIR - 放置可執(zhí)行程序目標(biāo)的目錄。
OBJECTS_DIR - 指定目標(biāo)文件(obj)的存放目錄。
INCLUDEPATH - 應(yīng)用程序所需的額外的包含路徑的列表。
DEPENDPATH - 應(yīng)用程序所依賴的搜索路徑。
VPATH - 尋找補(bǔ)充文件的搜索路徑。
LIBS - 包含要鏈接到project的庫(kù)的列表文件/ 路徑。用-l (library) 和 -L(library path)。
FORMS - 應(yīng)用程序中的所有.ui文件(由Qt設(shè)計(jì)器生成)的列表。
LEXSOURCES - 應(yīng)用程序中的所有l(wèi)ex源文件的列表。
YACCSOURCES - 應(yīng)用程序中的所有yacc源文件的列表。
DEF_FILE - 只有Windows需要:應(yīng)用程序所要連接的.def文件。
RC_FILE - 只有Windows需要:應(yīng)用程序的資源文件。
RES_FILE - 只有Windows需要:應(yīng)用程序所要連接的資源文件。
QMAKE_LFLAGS-設(shè)置鏈接器flag參數(shù),會(huì)修改Makefile的LFLAGS選項(xiàng)。該參數(shù)包含了傳遞給連接器的一組通用的標(biāo)記。使用指定的QMAKE_LFLAGS的好處在于,能夠根據(jù)當(dāng)前編譯的不同配置選擇不同路徑下的依賴庫(kù)。QMAKE_LFLAGS += -Wl,-rpath=./sqlite3,這樣編譯生成的可執(zhí)行文件依賴的sqlite庫(kù)就會(huì)是./sqlite3lib模板
lib模板告訴qmake為建立一個(gè)庫(kù)而生成makefile。當(dāng)使用這個(gè)模板時(shí),除了app模板中提到系統(tǒng)變量,還有一個(gè)VERSION是被支持的。VERSION - 目標(biāo)庫(kù)的版本號(hào),比如2.3.1。
subdirs模板
subdirs模板告訴qmake生成一個(gè)makefile,它可以進(jìn)入到特定子目錄并為這個(gè)目錄中的項(xiàng)目文件生成makefile并且為它調(diào)用make。在這個(gè)模板中只有一個(gè)系統(tǒng)變量SUBDIRS可以被識(shí)別。這個(gè)變量中包含了所要處理的含有項(xiàng)目文件的子目錄的列表。這個(gè)項(xiàng)目文件的名稱是和子目錄同名的,這樣qmake就可以發(fā)現(xiàn)它。例如,如果子目里是“myapp”,那么在這個(gè)目錄中的項(xiàng)目文件應(yīng)該被叫做myapp.pro。
CONFIG變量
配置變量指定了編譯器所要使用的選項(xiàng)和所需要被連接的庫(kù)。
下面這些選項(xiàng)控制著使用哪些編譯器標(biāo)志:
release - 應(yīng)用程序?qū)⒁詒elease模式連編,如果“debug”被指定,它將被忽略。
debug - 應(yīng)用程序?qū)⒁詃ebug模式連編。
warn_on - 編譯器會(huì)輸出盡可能多的警告信息,如果“warn_off”被指定,它將被忽略。
warn_off - 編譯器會(huì)輸出盡可能少的警告信息。
debug_and_release : The project is built in both debug and release modes.
debug_and_release_target: The project is built in both debug and release modes. TARGET is built into both the debug and release directories.
build_all : If debug_and_release is specified, the project is built in both debug and release modes by default.下面這些選項(xiàng)定義了所要連編的庫(kù)/應(yīng)用程序的類型:
qt - 應(yīng)用程序是一個(gè)Qt應(yīng)用程序,并且Qt庫(kù)將會(huì)被連接。
thread - 應(yīng)用程序是一個(gè)多線程應(yīng)用程序。
x11 - 應(yīng)用程序是一個(gè)x11應(yīng)用程序或庫(kù)。
windows - 只用于app模板:應(yīng)用程序是一個(gè)Windows下的窗口應(yīng)用程序。
console - 只用于app模板:應(yīng)用程序是一個(gè)Windows下的控制臺(tái)應(yīng)用程序。
dll - 只用于lib模板:庫(kù)是一個(gè)共享庫(kù)(dll)。
staticlib - 只用于lib模板:庫(kù)是一個(gè)靜態(tài)庫(kù)。
plugin - 只用于lib模板:庫(kù)是一個(gè)插件,這將會(huì)使dll選項(xiàng)生效。不同平臺(tái)
win32{SOURCES += xx.cpp}unix{SOURCES += xx.cpp}
- 1
- 2
- 3
- 4
- 5
- 6
.pro實(shí)例
TEMPLATE = lib #lib庫(kù),app可執(zhí)行工程TARGET = FuncCONFIG += console c++11 #C++11標(biāo)準(zhǔn)CONFIG -= qtDEFINES += IOS_64 #64位DEFINES += IOS_LINUX #Linux系統(tǒng)QMAKE_CXXFLAGS += -fPICQMAKE_LFLAGS_DEBUG += -L$$PWD/../../Bin/Debug/QMAKE_LFLAGS_DEBUG += -Wl,-rpath=../../Bin/Debug/QMAKE_LFLAGS_RELEASE += -L$$PWD/../../Bin/Debug/QMAKE_LFLAGS_RELEASE += -Wl,-rpath=../../Bin/Debug/LIBS += -ldl #要鏈接的庫(kù)LIBS += -lboost_threadrelease: CurConfig = Releasedebug: CurConfig = DebugDESTDIR = ../../Bin/$$CurConfig/ #目標(biāo)文件的最終路徑,從pro文件開(kāi)始的相對(duì)路徑 OBJECTS_DIR = obj/$$CurConfig #.o文件的目錄SOURCES += ../FunPublic/ts1.cpp ../FunPublic/ts2.cpp ../FunPublic/ts3.cpp HEADERS += ../FunPublic/ts1.h ../FunPublic/ts2.h ../FunPublic/ts3.h unix { target.path = /usr/lib INSTALLS += target}INCLUDEPATH += /usr/local/cuda/include/QMAKE_LFLAGS += -sharedQMAKE_LFLAGS += -L$$PWD/../../Bin/Debug/QMAKE_LFLAGS += -L$$PWD/../../../../ThirdPartyLib/openrave-0.9/libQMAKE_LFLAGS += -Wl,-rpath=../../../../ThirdPartyLib/openrave-0.9/lib/#如果要添加鏈接庫(kù),只需要加載頭文件路徑和動(dòng)態(tài)庫(kù)路徑即可# INCLUDEPATH += /usr/local/cuda/include/ #相對(duì)路徑是相對(duì)工程文件pro的路徑# QMAKE_LFLAGS += -L$$PWD/../../../../ThirdPartyLib/openrave-0.9/lib #相對(duì)路徑是相對(duì)工程文件pro的路徑 編譯時(shí)靜態(tài)鏈接# QMAKE_LFLAGS += -Wl,-rpath=../../../../ThirdPartyLib/openrave-0.9/lib/ #相對(duì)路徑是相對(duì)工作路徑 運(yùn)行時(shí)動(dòng)態(tài)鏈接# QMAKE_LFLAGS += -Wl,-rpath=\\\$\$ORIGIN/jsoncpp #相對(duì)路徑是相對(duì)so庫(kù)路徑 運(yùn)行時(shí)動(dòng)態(tài)鏈接
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
qmake實(shí)例
SOURCES = hello.cpp main.cppHEADERS = hello.hCONFIG += qt warn_on release
- 1
- 2
- 3
生成makefile (makefile是根據(jù).pro文件參數(shù)生成的): qmake -o Makefile hello.pro
qmake -t vcapp -o hello.dsp hello.pro
可以使用qmake -h
查看具體的說(shuō)明
qmake生成makefile
使用Qt編譯一次,查看是否有程序錯(cuò)誤鏈接錯(cuò)誤等
若編譯無(wú)誤,則在pro目錄下使用
qmake xx.pro -o Makefile
這時(shí)便自動(dòng)生成了Makefile文件當(dāng)在其他平臺(tái)上make編譯時(shí),可能編譯出現(xiàn)如下錯(cuò)誤(如NanoPi)
g++ -c -m64 -pipe -O2 -Wall -W -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include -o main.o main.cpp In file included from /usr/include/c++/4.8/thread:35:0, from baseserver.h:10, from server.h:4, from rdatas.h:4, from main.cpp:3:/usr/include/c++/4.8/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.#error This file requires compiler and library support for the ^In file included from rdatas.h:4:0, from main.cpp:3:server.h:20:14: warning: ‘void* ServerThread(void*)’ declared ‘static’ but never defined [-Wunused-function]static void *ServerThread(void *); ^make: *** [main.o] Error 1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
根據(jù)提示需要添加
-std=c++11
,于是把該項(xiàng)添加到CXXFLAGS
即可其實(shí)qmake生成的Makefile內(nèi)容很多無(wú)用的關(guān)于qt的項(xiàng)目可以刪除,最主要的是如下部分
# 以下可以選擇性刪除CC = gccCXX = g++CXXFLAGS = -pipe -O2 -Wall -W $(DEFINES) -std=c++11INCPATH = -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/includeLINK = g++LFLAGS = -Wl,-O1LIBS = $(SUBLIBS) -ljson -lpthread OBJS = main.o baseserver.o server.o baseuart.o rdatas.o# 這里自己添加總的編譯結(jié)果demo: $(OBJS)$(CXX) $(CXXFLAGS) $(OBJS) $(LIBS) -o $@ # 以下是copy的qmake自動(dòng)生成的compilemain.o: main.cpp rdatas.h server.h baseserver.h$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp baseserver.o: baseserver.cpp baseserver.h$(CXX) -c $(CXXFLAGS) $(INCPATH) -o baseserver.o baseserver.cppserver.o: server.cpp server.h baseserver.h$(CXX) -c $(CXXFLAGS) $(INCPATH) -o server.o server.cppbaseuart.o: baseuart.cpp baseuart.h$(CXX) -c $(CXXFLAGS) $(INCPATH) -o baseuart.o baseuart.cpprdatas.o: rdatas.cpp rdatas.h server.h baseserver.h$(CXX) -c $(CXXFLAGS) $(INCPATH) -o rdatas.o rdatas.cppclean:rm *.o demo
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
在不同平臺(tái)上運(yùn)行時(shí)可能有找不到文件或識(shí)別不了文件格式等錯(cuò)誤,刪除相關(guān)項(xiàng)目即可