qmake的使用(可设置c编译器flag参数)
本文由乌合之众 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$
http://www.cnblogs.com/oloroso/p/4595181.html
qmake的使用(可设置c编译器flag参数)的更多相关文章
- RHCE 系列(二):如何进行包过滤、网络地址转换和设置内核运行时参数
正如第一部分(“设置静态网络路由”)提到的,在这篇文章(RHCE 系列第二部分),我们首先介绍红帽企业版 Linux 7(RHEL)中包过滤和网络地址转换(NAT)的原理,然后再介绍在某些条件发生变化 ...
- Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数
Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4 为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...
- Linux设置串口波特率等参数
转自 http://blog.csdn.net/zoomdy/article/details/50921336 mingdu.zheng at gmail dot com stty查看串口参数 stt ...
- spark通过合理设置spark.default.parallelism参数提高执行效率
spark中有partition的概念(和slice是同一个概念,在spark1.2中官网已经做出了说明),一般每个partition对应一个task.在我的测试过程中,如果没有设置spark.def ...
- IDEA设置取消自动显示参数提示
IDEA设置取消自动显示参数提示 最近在使用IDEA的过程中,发现方法中一直显示形参名的提示,无法选中,也无法删除,基于不同人的使用习惯不同,有的人不喜欢这种提示,我也在网上寻找各种解决方案,由于搜索 ...
- AT+CSMP 设置短消息文本参数
AT+CSMP 设置短消息文本参数 2009-05-18 12:03 AT+CSMP 设置短消息文本参数(text模式下) 设置:AT+CSMP=<fo>,<vp/scts>, ...
- Linux QtCreator设置mingw编译器生成windows程序
Qt跨平台,那必须在Linux平台编译一个可以在windows下运行的Qt程序才行,当然还得和QtCreator环境弄在一起才行. 工作环境:Centos 7 yum install qt5-qt* ...
- CCS5 编译器手动设置dsp支持可变参数宏等问题
IDE:CSS5.4,compiler不支持可变参数宏.需要手动设置编译器相关选项: Language Option->Language Mode —>no strict ANSI. 1. ...
- 如何在maven pom.xml文件中设置Java编译器版本
今天遇到一个问题: 在Eclipse中用maven创建一个新的web项目,然后再用maven update一下,则JDK版本自动变为1.5. 通过查找资料,终于发现maven编译器插件(Maven C ...
随机推荐
- Codeforces 611C New Year and Domino(二维前缀和)
题目大概说给一个n*m个格子,格子'.'表示可以放东西,多次询问矩形区域(x1,y1)-(x2,y2)有几种放一张1*2的骨牌的方案数. 分别考虑横着竖着放,预处理出二维的前缀和,即sum[x][y] ...
- 页面显示(pageshow)和页面隐藏(pagehide)事件
Firefox和Opera有一个新特性,名叫“往返缓存”(back-forward cache,或bfcache),可以在用户使用浏览器的“后退”和“前进”按钮时加快页面的转换速度.这个缓存中不仅保存 ...
- Node.js 手册查询-5-Ejs 方法
express 中使用 //设置模板目录 app.set('views', path.join(__dirname, 'views')); //设置模板引擎 app.set('view engine' ...
- Web标准中用于改善Web应用程序性能的各种方法总结
提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...
- jQuery实现竖排菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- [知识点]C++中的运算符
1.前言 之前最开始学习语法和基础知识的时候,基本上最简单的运算符有所接触,当时对于位运算这种东西完全没有概念.今天对C++中出现的部分运算符尤其是位运算符进行一些总结. 2.+ - * / % 这些 ...
- qt播放器
播放器 http://blog.csdn.net/foruok/article/details/39005703 图片 http://blog.csdn.net/liyinhuicc/article/ ...
- 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM
一. 修改化定制Android4.0系统 Android系统启动时,先加载Linux内核,在Linux的framebuffer驱动里可以定制开 机界面,Linux内核启动成功后,挂载根文件系统,启动A ...
- Socket 与 WebSocket
本文转载自:http://zengrong.net/post/2199.htm 1. 概述 选择了 WebSocket 技术之后,不可避免的,我要将它和其他协议以及技术做一下比较.最常见的,就是需要比 ...
- (转载)String.IsNullorEmpty()方法的使用
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...