QT中的makefile

一个工程(project)中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。、

Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的
Makefile。编译整个工程你所要做的唯一的一件事就是在shell 提示符下输入make命令。整个工程完全自动编译,极大提高了效率。

如果你使用的是带有图形用户界面的集成化开发环境如VisualStudio,一般用不着手动编写makefile文件,当你需要时,VS可以为你自动生成。

QT中的qmake

qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。

手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合写几个Makefile。使用qmake,开发者创建一个简单的“项目”文件并且运行qmake生成适当的Makefile。qmake会注意所有的编译器和平台的依赖性,可以把开发者解放出来只关心他们的代码。Trolltech公司使用qmake作为Qt库和Qt所提供的工具的主要连编工具。

创建一个项目文件

qmake使用储存在项目(.pro)文件中的信息来决定Makefile文件中该生成什么。

一个基本的项目文件包含关于应用程序的信息,比如,编译应用程序需要哪些文件,并且使用哪些配置设置。

这里是一个简单的示例项目文件:

    SOURCES = hello.cpp
    HEADERS = hello.h
    CONFIG += qt warn_on release

我们将会一行一行的简要解释。

    SOURCES = hello.cpp

这一行指定了实现应用程序的源程序文件。在这个例子中,恰好只有一个文件,hello.cpp。大部分应用程序需要多个文件,这种情况下可以把文件列在一行中,以空格分隔,就像这样:

    SOURCES = hello.cpp main.cpp

另一种方式,每一个文件可以被列在一个分开的行里面,通过反斜线另起一行,就像这样:

    SOURCES = hello.cpp \
		main.cpp

一个更冗长的方法是单独地列出每一个文件,就像这样:

    SOURCES += hello.cpp
    SOURCES += main.cpp

这种方法中使用“+=”比“=”更安全,因为它只是向已有的列表中添加新的文件,而不是替换整个列表。

HEADERS这一行中通常用来指定为这个应用程序创建的头文件,举例来说:

    HEADERS += hello.h

列出源文件的任何一个方法对头文件也都适用。

CONFIG这一行是用来告诉qmake关于应用程序的配置信息。

    CONFIG += qt warn_on release

在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。这样做比使用“=”那样替换已经指定的所有选项是更安全的。

CONFIG一行中的qt部分告诉qmake这个应用程序是使用Qt来连编的。这也就是说qmake在连接和为编译添加所需的包含路径的时候会考虑到Qt库的。

CONFIG一行中的warn_on部分告诉qmake要把编译器设置为输出警告信息的。

CONFIG一行中的release部分告诉qmake应用程序必须被连编为一个发布的应用程序。在开发过程中,程序员也可以使用debug来替换release

项目文件就是纯文本(比如,可以使用像记事本、vim和xemacs这些编辑器)并且必须存为“.pro”扩展名。应用程序的执行文件的名称必须和项目文件的名称一样,但是扩展名是跟着平台而改变的。举例来说,一个叫做“hello.pro”的项目文件将会在Windows下生成“hello.exe”,而在Unix下生成“hello”。

生成Makefile

当你已经创建好你的项目文件,生成Makefile就很容易了,你所要做的就是先到你所生成的项目文件那里然后输入:

Makefile可以像这样由“.pro”文件生成:

    qmake -o Makefile hello.pro 

对于Visual Studio的用户,qmake也可以生成“.dsp”文件,例如:

    qmake -t vcapp -o hello.dsp hello.pro

开始很简单

让我们假设你已经完成了你的应用程序的一个基本实现,并且你已经创建了下述文件:

  • hello.cpp

  • hello.h

  • main.cpp

你可以在qt/qmake/example中发现这些文件。你对这个应用程序的配置仅仅知道的另一件事是它是用Qt写的。首先,使用你所喜欢的纯文本编辑器,在qt/qmake/tutorial中创建一个叫做hello.pro的文件。你所要做的第一件事是添加一些行来告诉qmake关于你所开发的项目中的源文件和头文件这一部分。

我们先把源文件添加到项目文件中。为了做到这点,你需要使用SOURCES变量。只要用SOURCES +=来开始一行,并且把hello.cpp放到它后面。你需要写成这样:

    SOURCES += hello.cpp

我们对项目中的每一个源文件都这样做,直到结束:

    SOURCES += hello.cpp
    SOURCES += main.cpp

如果你喜欢使用像Make一样风格的语法,你也可以写成这样,一行写一个源文件,并用反斜线结尾,然后再起新的一行:

    SOURCES = hello.cpp \
	      main.cpp

现在源文件已经被列到项目文件中了,头文件也必须添加。添加的方式和源文件一样,除了变量名是HEADERS。

当你做完这些时,你的项目文件就像现在这样:

    HEADERS += hello.h
    SOURCES += hello.cpp 
    SOURCES += main.cpp 

目标名称是自动设置的,它被设置为和项目文件一样的名称,但是为了适合平台所需要的后缀。举例来说,加入项目文件叫做“hello.pro”,在Windows上的目标名称应该是“hello.exe”,在Unix上应该是“hello”。如果你想设置一个不同的名字,你可以在项目文件中设置它:

    TARGET = helloworld

最后一步是设置CONFIG变量。因为这是一个Qt应用程序,我们需要把“qt”放到CONFIG这一行中,这样qmake才会在连接的时候添加相关的库,并且保证mocuic的连编行也被包含到Makefile中。

最终完成的项目文件应该是这样的:

    CONFIG += qt
    HEADERS += hello.h
    SOURCES += hello.cpp
    SOURCES += main.cpp 

你现在可以使用qmake来为你的应用程序生成Makefile。在你的应用程序目录中,在命令行下输入:

    qmake -o Makefile hello.pro

然后根据你所使用的编译器输入make或者nmake

使应用程序可以调试

应用程序的发布版本不包含任何调试符号或者其它调试信息。在开发过程中,生成一个含有相关信息的应用程序的调试版本是很有用处的。通过在项目文件的CONFIG变量中添加“debug”就可以很简单地实现。

例如:

    CONFIG += qt debug
    HEADERS += hello.h
    SOURCES += hello.cpp
    SOURCES += main.cpp 

像前面一样使用qmake来生成一个Makefile并且你就能够调试你的应用程序了。

添加特定平台的源文件

在编了几个小时的程序之后,你也许开始为你的应用程序编写与平台相关的部分,并且决定根据平台的不同编写不同的代码。所以现在你有两个信文件要包含到你的项目文件中-hello_win.cpphello_x11.cpp。我们不能仅仅把这两个文件放到SOURCES变量中,因为那样的话会把这两个文件都加到Makefile中。所以我们在这里需要做的是根据qmake所运行的平台来使用相应的作用域来进行处理。

为Windows平台添加的依赖平台的文件的简单的作用域看起来就像这样:

    win32 {
	SOURCES += hello_win.cpp
    }

所以如果qmake运行在Windows上的时候,它就会把hello_win.cpp添加到源文件列表中。如果qmake运行在其它平台上的时候,它会很简单地把这部分忽略。现在接下来我们要做的就是添加一个X11依赖文件的作用域。

当你做完了这部分,你的项目文件应该和这样差不多:

    CONFIG += qt debug
    HEADERS += hello.h
    SOURCES += hello.cpp
    SOURCES += main.cpp 
    win32 {
	SOURCES += hello_win.cpp
    }
    x11 {
	SOURCES += hello_x11.cpp
    }

像前面一样使用qmake来生成Makefile。

如果一个文件不存在,停止qmake

如果某一个文件不存在的时候,你也许不想生成一个Makefile。我们可以通过使用exists()函数来检查一个文件是否存在。我们可以通过使用error()函数把正在运行的qmake停下来。这和作用域的工作方式一样。只要很简单地用这个函数来替换作用域条件。对main.cpp文件的检查就像这样:

    !exists( main.cpp ) {
	error( "No main.cpp file found" )
    }

“!”用来否定这个测试,比如,如果文件存在,exists( main.cpp )是真,如果文件不存在,!exists( main.cpp )是真。

    CONFIG += qt debug
    HEADERS += hello.h
    SOURCES += hello.cpp
    SOURCES += main.cpp 
    win32 {
	SOURCES += hello_win.cpp
    }
    x11 {
	SOURCES += hello_x11.cpp
    }
    !exists( main.cpp ) {
	error( "No main.cpp file found" )
    }

像前面一样使用qmake来生成Makefile。如果你临时改变main.cpp的名称,你会看到信息,并且qmake会停止处理。

检查多于一个的条件

假设你使用Windows并且当你在命令行运行你的应用程序的时候你想能够看到qDebug()语句。除非你在连编你的程序的时候使用console设置,你不会看到输出。我们可以很容易地把console添加到CONFIG行中,这样在Windows下,Makefile就会有这个设置。但是如果告诉你我们只是想在当我们的应用程序运行在Windows下并且debug已经在CONFIG行中的时候,添加console。这需要两个嵌套的作用域;只要生成一个作用域,然后在它里面再生成另一个。把设置放在最里面的作用域里,就像这样:

    win32 {
	debug {
	    CONFIG += console
	}
    }

嵌套的作用域可以使用冒号连接起来,所以最终的项目文件看起来像这样:

    CONFIG += qt debug
    HEADERS += hello.h
    SOURCES += hello.cpp
    SOURCES += main.cpp 
    win32 {
	SOURCES += hello_win.cpp
    }
    x11 {
	SOURCES += hello_x11.cpp
    }
    !exists( main.cpp ) {
	error( "No main.cpp file found" )
    }
    win32:debug {
	CONFIG += console
    }

就这些了!你现在已经完成了qmake的教程,并且已经准备好为你的开发项目写项目文件了。

猜你喜欢

转载自blog.csdn.net/qq_40452317/article/details/90047738
今日推荐