文档章节

用qmake生成Makefile

openthings
 openthings
发布于 2015/01/22 16:58
字数 1682
阅读 3575
收藏 1

1.简介:
  qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。是qt工具包的一部分.在Unix&linux上写程式的人大概都碰过Makefile。用 make来开发和编译程式的确很方便,可是要写出一个Makefile就不简单了,手写Makefile是比较困难并且容易出错的,这阻挡了很多一部分的linux爱好者加入linux程序开发的阵营。
 
 虽然Open Source Software也有GNU Automake和GNU Autoconf两个软件可以生成makefile文件,但是对于一个简单的项目,使用Automake和Autoconf就有点杀鸡也用宰牛刀了。使用qmake完全可以符合你的要求.Trolltech公司使用qmake作为Qt库和Qt所提供的工具的主要连编工具。
  
  2.安装qmake
  在linux平台上,安装完qt以及相关的qt工具包,qmake就已经被安装好了.你唯一要注意的就是QTDIR值的设定,这个必须设置到Qt被安装到的地方。如:/usr/lib/qt3/,以及qmake可执行文件的路径加到PATH路径中.
  
  3. 一个简单的例子
  用vi写个hello.c ,
  #include
  int main(int argc, char** argv)
  {
      printf("Hello, world!\n");
      return 0;
  }
  创建qmake需要的项目文件(hello.pro),
  SOURCES = hello.cpp
  CONFIG += qt warn_on release
  Makefile可以像这样由".pro"文件生成:
  qmake -o Makefile hello.pro
  现在你的目录下已经产生了一个 Makefile 文件,输入"make" 指令就可以开始编译 hello.c 成执行文件,执行 ./hello 和 world 打声招呼吧!打开这个Makefile文件看看,是不是很专业啊!
  
  4.高级操作技巧
 当然,在实际使用过程中,我们的工程不可能象这个程序这样简单的,它可能有多个目录,多个头文件,多个源文件,需要链接器它不同的链接库等等情况。别急,让我和你慢慢道来。这些都是非常容易用qmake来实现的。我们从一个更加复杂的项目文件为例和你详细的讲诉qmake的高级技巧:
  项目文件示例:
  SOURCES += myqt.cpp
  SOURCES += main.cpp
  HEADERS += myqt.h
  FORMS += xsimform.ui
  TEMPLATE = lib
  CONFIG += debug warn_on qt thread x11 plugin
  TARGET = ../bin/panel_qt
  INCLUDEPATH = ../../../../xsim ../../../../xsim/IMdkit
  DEFINES = BDB_VERSION4 OS_LINUX
  从这个文件可以知道,SOURCES变量指向项目中的源文件,当项目中有多个源文件时,我们需对项目中的每一个源文件都这样做,直到结束:
  SOURCES += hello.cpp
  SOURCES += main.cpp
  当然,如果你喜欢使用像Make一样风格的语法,你也可以写成这样,一行写一个源文件,并用反斜线结尾,然后再起新的一行:
  SOURCES = hello.cpp main.cpp
  HEADERS变量指向项目中的头文件,多个头文件的时候,和多个源文件的解决方法一致。
  FORMS变量指向项目中使用到的窗体文件(qtdesign设计的.ui文件),qmake也注意了Qt的特殊需求,可以自动的包含moc和uic的连编规则。没有的话或者非qt程序可以不写。
  TEMPLATE变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:
  app - 建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用

       lib - 建立一个链接库的makefile。
  vcapp - 建立一个应用程序的Visual Studio项目文件。
  vclib - 建立一个库的Visual Studio项目文件。
  subdirs - 这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的mkefile。
  CONFIG变量变量指定了编译器所要使用的选项和所需要被连接的库。配置变量中可以添加任何东西,但只有下面这些选项可以被qmake识别。
  下面这些选项控制着使用哪些编译器标志:
  release - 应用程序将以release模式连编。如果"debug"被指定,它将被忽略。
  debug - 应用程序将以debug模式连编。
  warn_on - 编译器会输出尽可能多的警告信息。如果"warn_off"被指定,它将被忽略。
  warn_off - 编译器会输出尽可能少的警告信息。
  下面这些选项定义了所要连编的库/应用程序的类型:
  qt - 应用程序是一个Qt应用程序,并且Qt库将会被连接。
  thread - 应用程序是一个多线程应用程序。
  x11 - 应用程序是一个X11应用程序或库。
  windows - 只用于"app"模板:应用程序是一个Windows下的窗口应用程序。
  console - 只用于"app"模板:应用程序是一个Windows下的控制台应用程序。
  dll - 只用于"lib"模板:库是一个共享库(dll)。
  staticlib - 只用于"lib"模板:库是一个静态库。
  plugin - 只用于"lib"模板:库是一个插件,这将会使dll选项生效。
  TARGET变量指定生成的二进制代码的路径和文件名,如果建立的是一个链接库的话,它会在文件名前面自动加上"lib"和在最后自动加上".so".
  我们在使用过程中可能会使用到另外的一些函数库,链接库等。函数库的头文件指定使用INCLUDEPATH变量,其它链接库的指定可以通过LIBS 变量来指定,例LIBS += -lmath -L/usr/local/lib
  DEFINES变量的指定就如同make的-D选项一样。
  
  结束语
 
 Autoconf 和 Automake功能十分强大,但对于普通用户来说,太过复杂。qmake方便、简单、快捷,是一个轻量级的makefile生成工具,虽然它是qt工具包的一部分,但它也完全可以用来进行其它程序makefile文件的生成,对于大多数人来说,它已经是非常的够用了。你也可以从qt提供的许多现存的源程序中找到相关的.
pro项目文件,它们是学习qmake 更多技巧的最佳范例。
  这篇简介只用到了 qmake 的一些皮毛罢了,希望这篇文件能帮助你对产生 Makefile有个简单的依据。
原文连接:http://www.designxf.com/Article/200611/5802894.htm



本文转载自:http://linux.chinaunix.net/techdoc/develop/2007/04/20/955840.shtml

共有 人打赏支持
openthings
粉丝 297
博文 1093
码字总数 621967
作品 1
东城
架构师
私信 提问
详解 QT 中.pro文件的写法

详解 QT 中.pro文件的写法 QT 中.pro文件的写法是本文要介绍的内容,在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1、注释 从“#”开...

pd2pd
2013/03/11
0
0
Qt构建工具--Qmake

qmake是一个协助简化跨平台进行专案开发的构建过程的工具程式,Qt附带的工具之一 。qmake能够自动生成Makefile、Microsoft Visual Studio 专案文件 和 xcode 专案文件。不管源代码是否是用Q...

匿名
2012/05/08
6.7K
1
QT中PRO文件写法的详细介绍

在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释 从“#”开始,到这一行结束。 2.模板变量告诉qmake为这个应用程序生成哪种mak...

石头哥哥
2016/02/16
688
0
qmake 乱乱乱谈(一)

不想太深入地去看qmake,可是,左等,右等,总不见Qt新的构建系统有什么新消息。还是整理一下qmake吧,由于没什么主题,还不知道本文最终会乱到什么程度。 注:你可能会对下面的内容感兴趣。...

晨曦之光
2012/05/08
458
0
Qt中undefined reference to vtable for "xxx::xxx"的总结

Qt中,undefined reference to ‘vtable for 通常出现在打开了宏 Q_OBJECT的程式当中。我遇到的情况是: 将类体及类体实现直接写到main.cpp里,没 有包含 moc文件。这是一种常见的C++错误,通...

乔三爷
2016/06/03
28
0

没有更多内容

加载失败,请刷新页面

加载更多

https://www.jianshu.com/p/dbffae16ba0b

https://www.jianshu.com/p/dbffae16ba0b

张宏亮1982
23分钟前
5
0
linux基本命令

linux常用shell命令=命令+选项+参数 cd (change directory)切换目录 cd #root根目录 cd / #系统根目录 cd ../../ #返回上上一层目录 ls/dir (list)列出目录下文件 ls -a (--all) #列出所...

陈刚生
28分钟前
2
0
30分钟学会如何使用Shiro

本篇内容大多总结自张开涛的《跟我学Shiro》原文地址:http://jinnianshilongnian.iteye.com/blog/2018936 我并没有全部看完,只是选择了一部分对我来说急需在项目中使用的知识加以学习。并且...

群星纪元
30分钟前
2
0
常用算法之快速排序python&php

python(快速排序): # -*- UTF-8 -*- def quicksort(arr): if (len(arr)) < 2: return arr; mark = arr[0] #递归条件 #第一种方式 # left = [i for i in arr[1:] if i < mark]; # right = [i ......

山人有妙计
33分钟前
0
0
synchronized关键字

synchronized关键字可分为对象锁和类锁,修饰对象可分为代码块和方法 。 修饰代码块: 1.对象锁:synchronized (this) 或 synchronized (object) : 如果是同一个实例,则代码块的执行有先后;...

某只小强
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部