本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso

本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso


还是先说一下当前的系统环境:Ubuntu 14.04 + Qt5.4

如果没有安装过QT,可以安装下面几个qt软件

sudo apt-get install qt5-default qt5-doc-html qt5-qmake qt5-doc qt5-image-formats-plugins

这只是对qmake使用的一个说明而已。如果一直使用Qt Create来构建工程,很容易让人以为Qt项目必须使用Qt Create来创建。其实我们可以像写普通的C++工程一样,不一定需要IDE,编辑器+编译器即可搞定了。

不过这个有一个缺点,就是如果在connect函数连接信号的槽的时候,即便是槽函数不存在,也能够通过编译

1. 先来写源代码

必须先写源代码,这个源代码很简单,就是创建一个Widget,然后widget上面有一个PushButton,点击之后弹出一个MessageBox来提示一个"hello world"

hello.h

#ifndef __HELLO_H_
#define __HELLO_H_ #include <QWidget> class hello:public QWidget{
Q_OBJECT
public:
explicit hello(QWidget *parent = 0);
~hello(); public slots:
//槽函数,处理button单击
void btn_click();
private:
}; #endif #endif

hello.cpp

#include "hello.h"

#include <QPushButton>
#include <QMessageBox> hello::hello(QWidget *parent)
: QWidget(parent){ //创建一个PushButton
QPushButton * btn = new QPushButton("点击我^-^",this);
//连接信号和槽
connect(btn,SIGNAL(clicked()),this,SLOT(btn_click())); } void hello::btn_click()
{
QMessageBox::information(NULL, "单击了button",
"hello world", QMessageBox::Yes);
}

main.cpp

#include "hello.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
hello w;
w.show(); return a.exec();
}

2.编写.pro文件

***.pro是Qt的工程文件,这个文件是给qmake用来生成Makefile用的。

如果了解makefile的人应该知道,Makefile的三个关键点就是目标依赖命令。这里也很类似。

.pro文件中可以指明这个Qt项目的头文件源文件链接的外部库目标文件名模板(生成什么样的Makefile)版本配置(debug/release)等。

这里并不打算详细介绍每一个部分,只做简单介绍

.pro中变量 含义 示例
TEMPLATE 模板变量指定生成makefile(app:应用程序/lib:库) TEMPLATE = app
QT 使用到的Qt定义的类(core/gui/widgets...) QT += widgtes
DESTDIR 指定生成的应用程序放置的目录 DESTDIR += ../bin
TARGET 指定生成的应用程序名 TARGET = hello
HEADERS 工程中包含的头文件 HEADERS += hello.h
FORMS 工程中包含的.ui设计文件 FORMS += hello.ui
SOURCES 工程中包含的源文件 SOURCES += main.cpp hello.cpp
RESOURCES 工程中包含的资源文件 RESOURCES += qrc/hello.qrc
LIBS 引入的lib文件的路径 -L:引入路径 LIBS += -L.
CONFIG 用来告诉qmake关于应用程序的配置信息 CONFIG+= qt warn_on release
UI_DIR 指定.ui文件转化成ui_*.h文件的存放目录 UI_DIR += forms
RCC_DIR 指定将.qrc文件转换成qrc_*.h文件的存放目录 RCC_DIR += ../tmp
MOC_DIR 指定将含Q_OBJECT的头文件转换成标准.h文件的存放目录 MOC_DIR += ../tmp
OBJECTS_DIR 指定目标文件(obj)的存放目录 OBJECTS_DIR += ../tmp
DEPENDPATH 程序编译时依赖的相关路径 DEPENDPATH += . forms include qrc sources
INCLUDEPATH 头文件包含路径 INCLUDEPATH += .
DEFINES 增加预处理器宏(gcc的-D选项)。 DEFINES += USE_MY_STUFF
QMAKE_CFLAGS 设置c编译器flag参数 QMAKE_CFLAGS += -g
QMAKE_CXXFLAGS 设置c++编译器flag参数 QMAKE_CXXFLAGS += -g
QMAKE_LFLAGS 设置链接器flag参数 QMAKE_LFLAGS += -rdynamic

-还有,这个.pro文件中,以#开头的是注释

具体可以看这篇文章:QT中PRO文件写法的详细介绍

hello.pro

因为我们这里比较简单,就只写需要的部分了。

# 使用到的Qt库
QT += core widgets #目标文件名
TARGET = hello #生成应用程序
TEMPLATE = app #用到的cpp源文件
SOURCES += main.cpp hello.cpp #用到的cpp头文件
HEADERS += hello.h

3. 使用qmake生成Makefile文件

qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。是qt工具包的一部分.使用qmake作为Qt库和Qt所提供的工具的主要连编工具。

qmake程序在Qt的安装目录下,比如我的机器上就在

o@o-pc:~/program_files/Qt5.4.1/5.4/gcc_64/bin$

你可以把这个路径加入到系统环境变量的PATH变量中,这样就可以随便使用了。我不喜欢加入到环境变量,所以这里指定路径来运行。

如果没有安装Qt qmake,可以使用apt-get来获取(大便系的linux)

o@o-pc:~/MyStudy$ sudo apt-get install qt5-qmake

如果你加了,使用下面的命令来生成Makefile文件

qmake hello.pro -o Makefile

其实这样也可以(qtchooser在/usr/bin目录下,这里的qt是安装到默认目录的)

o@o-pc:~/hello$ qtchooser  -run-tool=qmake  -qt=5 hello.pro

我这里是这样的

o@o-pc:~/program_files/Qt5.4.1/5.4/gcc_64/bin$ ./qmake ~/hello/hello.pro -o ~/hello/Makefile

编译hello程序

生成了makefile之后,使用make命令来编译就可以了。

可以看到我这里出了一点问题,报了一堆错误。是因为没有链接xcb这个库。这是在我安装了xcb库之后依然存在的错误,最开始是找不到libGL这个问题。解决的办法就是修改.pro文件。这个见后面

o@o-pc:~/hello$ make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o main.o main.cpp
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o widget.o widget.cpp
/usr/lib/x86_64-linux-gnu/qt5/bin/moc -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -I/usr/include/c++/4.8 -I/usr/include/x86_64-linux-gnu/c++/4.8 -I/usr/include/c++/4.8/backward -I/usr/lib/gcc/x86_64-linux-gnu/4.8/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include widget.h -o moc_widget.cpp
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o moc_widget.o moc_widget.cpp
g++ -m64 -Wl,-O1 -o hello main.o widget.o moc_widget.o -L/usr/X11R6/lib64 -lQt5Widgets -L/usr/lib/x86_64-linux-gnu -lQt5Gui -lQt5Core -lGL -lpthread
/usr/lib/x86_64-linux-gnu/libGL.so:对‘xcb_poll_for_special_event’未定义的引用
/usr/lib/x86_64-linux-gnu/libGL.so:对‘xcb_wait_for_special_event’未定义的引用
//usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0:对‘xcb_get_reply_fds’未定义的引用
/usr/lib/x86_64-linux-gnu/libGL.so:对‘xcb_unregister_for_special_event’未定义的引用
/usr/lib/x86_64-linux-gnu/libGL.so:对‘xcb_register_for_special_xge’未定义的引用
//usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0:对‘xcb_send_fd’未定义的引用
collect2: error: ld returned 1 exit status
make: *** [hello] 错误 1

解决 xcb_xxx未定义的引用的问题

这里出现的都是xcb_xxx...未定义的引用的问题,说明在链接的时候没有链接到libxcb库。很好解决,修改pro文件中的LIBS变量就是。

# 使用到的Qt库
QT += core widgets #目标文件名
TARGET = hello #生成应用程序
TEMPLATE = app #用到的cpp源文件
SOURCES += main.cpp hello.cpp #用到的cpp头文件
HEADERS += hello.h #解决 xcb_xxx未定义引用问题
LIBS += -lxcb

未出错的编译

下面可以直接使用qmake是因为我安装了qt5-qmake(sudo apt-get install qt5-qmake)

o@o-pc:~/hello$ ls
hello.cpp hello.h hello.pro hello.pro.user main.cpp
o@o-pc:~/hello$ qmake
o@o-pc:~/hello$ make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o main.o main.cpp
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o hello.o hello.cpp
/usr/lib/x86_64-linux-gnu/qt5/bin/moc -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -I/usr/include/c++/4.8 -I/usr/include/x86_64-linux-gnu/c++/4.8 -I/usr/include/c++/4.8/backward -I/usr/lib/gcc/x86_64-linux-gnu/4.8/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include hello.h -o moc_hello.cpp
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o moc_hello.o moc_hello.cpp
g++ -m64 -Wl,-O1 -o hello main.o hello.o moc_hello.o -L/usr/X11R6/lib64 -lxcb -lQt5Widgets -L/usr/lib/x86_64-linux-gnu -lQt5Gui -lQt5Core -lGL -lpthread
o@o-pc:~/hello$

下面来看一下运行效果

qmake的使用的更多相关文章

  1. 【xcode】qt程序不通过qmake,运行找不到动态库的坑

    现象:试图在一个已有项目里增加qt的代码,因此手动加入相关framework(未通过qmake生成工程),编译连接都通过,但是运行时崩溃,提示错误: dyld: Library not loaded ...

  2. Qt qmake 使用(含遗留问题)

    网上在介绍编译Qt的教程中,大多数都是这样提到编译的: 1, 运行 VS2012 x86 Native Tools Command Prompt 批处理 2, cd <install qt5.0 ...

  3. 使用qmake构建程序(有关.pro和.vcproj编译选项对应关系)

    houjinxin 为了方便统一构建,准备使用qmake构建所有的vc工程,无论是否使用了Qt库,可是在网上找了几天,有几个选项根本就不知道怎么在pro里面配置,才能生成预期的vcproj文件... ...

  4. 利用qmake生成Makefile文件

    在linux下写程序,免不了要写Makefile文件,用automake,总感觉比较麻烦,linux人喜欢做麻烦的事,以显得风格迥异. 其实用qmake生成Makefile文件相当简单. 1 装好qm ...

  5. 翻译qmake文档 目录

    利用空闲时间把qmke的文档翻译出来,翻译水平有限,有些地方翻译的不好,请谅解, 如果您能指出来,我会很感激并在第一时候做出修改. 翻译qmake文档(一) qmake指南和概述 翻译qmake文档( ...

  6. 翻译qmake文档(四) Building Common Project Types

    翻译qmake文档 目录 本章原英文文档:http://qt-project.org/doc/qt-5/qmake-common-projects.html 构建常见的项目类型        本章描述 ...

  7. 翻译qmake文档(三) Creating Project Files

    翻译qmake文档 目录   原英文文档:http://qt-project.org/doc/qt-5/qmake-project-files.html   创建项目文件 项目文件包含qmake构建你 ...

  8. 翻译qmake文档(二) Getting Started

    翻译qmake文档 目录 原英文文档: http://qt-project.org/doc/qt-5/qmake-tutorial.html         本教程教讲授qmake基础知识.这个手册里 ...

  9. 翻译qmake文档(一) qmake指南和概述

    翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...

随机推荐

  1. 如何查看crontab的日志记录

    在Unix和类Unix的操作系统之中,crontab命令常用于设置周期性被执行的指令,也可以理解为设置定时任务. crontab中的定时任务有时候没有成功执行,什么原因呢?这时就需要去日志里去分析一下 ...

  2. jquery 停止animate动画,并且回复最初状态

    // 热门推荐悬浮效果 $("#recom_con li img").mouseenter(function(){ $(this).stop(true, true); $w = p ...

  3. 使用phpize增加php模块

    一,phpize的好处 什么时候我们要用phpize呢?我们在安装php时: ./configure --prefix=/apps/product/php --with-config-file-pat ...

  4. python 文件包含

    Python的import包含文件功能就跟PHP的include类似,但更确切的说应该更像是PHP中的require,因为Python里的import只要目标不存在就报错程序无法往下执行.要包含目录里 ...

  5. 缺陷跟踪系统Mantis Bug Tracker

    缺陷管理平台Mantis,也做MantisBT,全称Mantis Bug Tracker. 项目在github的地址:https://github.com/mantisbt/mantisbt Mant ...

  6. yum clean all 是什么意思

    yum会将下载下来的 包文件rpm和头文件header存盘在 本地机器的硬盘 缓存中, 这个将占用 硬盘空间, 可以将这些内容清除掉, 以释放磁盘空间: yum clean headers: // 释 ...

  7. MySQL 中NULL和空值的区别

    平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解.注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效 ...

  8. Linux启动流程CentOS6

    1.运行级别 0 关机 1 单用户模式,可以想象为Windows的安全模式,主要用与系统修复 2 不完全的命令行模式,不含NFS服务 3 完全的命令行模式,就是标准字符界面 4 系统保留 5 图像模式 ...

  9. 分词工具ICTCLAS5.0使用心得

    接触自然语言处理有一年多了,最基本的一些自然是分词,词性标注,命名实体识别之类的知识,有些应用知道原理是一回事,自己动手做起来又是另外一回事了.最近又开始重操旧业:分词.分词最著名的自然就是中科院的分 ...

  10. django view

    当请求一个页面时,Django 创建一个包含有关请求数据的 HttpRequest 对象,并将它作为第一个参数传给视图函数,每个视图函数处理完相应逻辑后返回一个 HttpResponse 对象,Htt ...