與一個大四的學(xué)生同做一個項目,源文件有幾十個,剛開始還在為寫makefile發(fā)愁,幸好找到了automake工具鏈,覺得真是省了不少事。
后來他跟我說他用的是qmake,比用automake更省了不少事。一比較,發(fā)現(xiàn)qmake確實是一個更好地選擇。
automake工具鏈比較復(fù)雜。一般要autoscan+修改configure.in+aclocal+寫Makefile.am+configure+make。很不容易上手,而且
容易出錯。automake提供了更為精細的控制,復(fù)雜但強大。但其實一般我們也用不了那么多的功能,而且中間生成的那些配置文件也不在
少數(shù)。這時候還要將源碼與makefile部分分離開來。一般的開源軟件就采用這種方法,文件層次清楚,易于管理。但是一般的很少的文件
的話,我覺得用qmake就足夠了,易于上手,也不易出錯。
qmake一般是qmake -project/qmake/make三步,中間需要適當?shù)匦薷纳傻?.pro文件,然后就差不多了。qmake -project主要就是用
來生成*.pro文件。主要做的就是讀入當前目錄的源文件。一些常用的配置變量如下:
Variable | Contents |
---|
CONFIG | General project configuration options. |
DESTDIR | The directory in which the executable or binary file will be placed. |
FORMS | A list of UI files to be processed by uic. |
HEADERS | A list of filenames of header (.h) files used when building the project. |
QT | Qt-specific configuration options. |
RESOURCES | A list of resource (.rc) files to be included in the final project. See the The Qt Resource System for more information about these files. |
SOURCES | A list of source code files to be used when building the project. |
TEMPLATE | The template to use for the project. This determines whether the output of the build process will be an application, a library, or a plugin. |
變量之間可以相互賦值比如。
TEMP_SOURCES = $$SOURCES
Template變量比較重要:用來決定所建工程的類型:
Template | Description of qmake output |
---|
app (default) | Creates a Makefile to build an application. |
lib | Creates a Makefile to build a library. |
subdirs | Creates a Makefile containing rules for the subdirectories specified using the SUBDIRSvariable. Each subdirectory must contain its own project file. |
vcapp | Creates a Visual Studio Project file to build an application. |
vclib | Creates a Visual Studio Project file to build a library. |
vcsubdirs | Creates a Visual Studio Solution file to build projects in sub-directories. |
一般用的都是app。
再說上面的config變量,內(nèi)置的有:
Option | Description |
---|
release | The project is to be built in release mode. This is ignored if debug is also specified. |
debug | The project is to be built in debug mode. |
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 intoboth 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. |
autogen_precompile_source | Automatically generates a .cpp file that includes the precompiled header file specified in the .pro file. |
ordered | When using the subdirs template, this option specifies that the directories listed should be processed in the order in which they are given. |
warn_on | The compiler should output as many warnings as possible. This is ignored ifwarn_off is specified. |
warn_off | The compiler should output as few warnings as possible. |
copy_dir_files | Enables the install rule to also copy directories, not just files. |
debug_and_release建立兩個版本。config還可以加上qt,thread,X11等用來指定建立相應(yīng)的工程類型。
如果是qt工程的話,QT變量就是一個需要關(guān)注的對象。當用到相應(yīng)的庫時,就要加上相應(yīng)的名字比如:
常用的就是core,gui.其他的用到時加上就行。
另外一個比較重要問題就是QT與其他庫的融合,LIBS和INCLUDEPATH可以做到這一點。看名字就知道其作用。
和Gcc命令行參數(shù)的用法類似。
qmake也有一些內(nèi)置的函數(shù)用來提供更為強大的功能。常用到的有include,可以用來包含其他的工程文件,類似于C的頭文件。還有條件控制類的,如:
win32 { SOURCES += paintwidget_win.cpp }
win32就是一個條件。甚至還有循環(huán)控制語句:
EXTRAS = handlers tests docs for(dir, EXTRAS) { exists($$dir) { SUBDIRS += $$dir } }
這樣算下來,其實qmake也挺復(fù)雜的,不過相對于automake來說,還是很容易的。