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

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的安装目录下,比如我的机器上就在
[email protected]:~/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

原文地址:https://www.cnblogs.com/senior-engineer/p/8469297.html

时间: 2024-07-29 15:35:35

qmake的使用(可设置c编译器flag参数)的相关文章

smb设置参考手册 --详细参数

#----------------------------------------------------------------------------------## smb设置参考手册 ## ##----------------------------------------------------------------------------------# [global] #-------------------------------------------------------

Android开发中Flag参数的讲解

Android开发中Flag参数的讲解: Intent对象在Android开发中起着举足轻重的作用,其内置了丰富的常量,用于传递数据, 下面本文将介绍跟Task有关的一些Flag参数,各参数的理解均来自Android API和本人在实际项目中的体验,如果有描述不当之处,还请各位不吝赐教. 1.FLAG_ACTIVITY_BROUGHT_TO_FRONT:不在程序代码中设置,在launchMode中设置singleTask模式时系统帮你设定. 2.FLAG_ACTIVITY_CLEAR_TOP:清

RHCE 系列(二):如何进行包过滤、网络地址转换和设置内核运行时参数

正如第一部分(“设置静态网络路由”)提到的,在这篇文章(RHCE 系列第二部分),我们首先介绍红帽企业版 Linux 7(RHEL)中包过滤和网络地址转换(NAT)的原理,然后再介绍在某些条件发生变化或者需要变动时设置运行时内核参数以改变运行时内核行为. RHEL 7 中的网络包过滤 当我们讨论数据包过滤的时候,我们指防火墙读取每个试图通过它的数据包的包头所进行的处理.然后,根据系统管理员之前定义的规则,通过采取所要求的动作过滤数据包. 正如你可能知道的,从 RHEL 7 开始,管理防火墙的默认

微信分享到朋友圈,分享给好友设置标题图片描述参数

var imgUrl = "http://xxxxx.com/activity/images/logo.jpg"; var lineLink = window.location.href; var descContent = '来宜人贷参与抢钱活动100%获得10000金币,还可以兑换成现金哦~'; var shareTitle = '来宜人贷 拼人品抢现金'; var appid = 'wx237b223ad5773cf5'; function shareFriend() { Wei

bboss持久层设置数据库查询fetchsize参数方法

jdbc驱动程序api提供了指定了查询语句fetchsize的方法,有些数据库(比如oracle)本身提供了fetchsize的默认值,这样进行大量数据查询时,不会因为返回的结果集太大导致jvm爆掉,有些数据库可能没有默认设置fetchsize,因此需要手动指定.bboss持久层设置数据库查询fetchsize参数方法很简单,只要在poolman.xml文件的datasource中指定一个queryfetchsize参数即可,如果不指定就采用数据库驱动提供的默认值. 设置queryfetchsi

?Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1.2语言快速入门v2.0. [示例7-11]以下的代码就为外部参数toString.withJoiner设置了默认的参数"Swift"和"---".代码如下: import Foundation func join(string s1: String, toString

设置Maven的JVM参数

引言: Maven工具提供了非常强大且简便的项目管理方式,包括编译.打包.发布和部署等诸多的功能:针对Java应用来说,时常在测试环境中,在Eclipse中进行部署时,出现各种内存溢出的JVM错误,一般来说需要进行JVM的设置,那怎么来设置呢? 1.  问题的引出 在基于Maven管理的Java项目中,基于maven在IDE中直接继续开发测试,经常出现内存溢出的错误,这种情况下,需要进行JVM的参数设置更新,一般而言,都是根据内存溢出问题的不同,针对内存.permspace来进行调整和设置. 2

Linux QtCreator设置mingw编译器生成windows程序

Qt跨平台,那必须在Linux平台编译一个可以在windows下运行的Qt程序才行,当然还得和QtCreator环境弄在一起才行. 工作环境:Centos 7 yum install qt5-qt* ming32-qt5-qt* ming64-qt5-qt* # 安装所有Qt的包 yum install qt-creator # 安装qtcreator 以mingw64为例 打开QtCreator,options=> Build & Run => Qt Versions => A

【练习6.7】设置cvCanny的不同参数处理图像,对比结果

提纲 题目要求 程序代码 结果图片 要言妙道 题目要求: 通过设置cvCanny中好的低阈值和高阈值,使用三种不同的高低阈值比,分别为1.5:1 .2.75:1.4:1 a.设置高阈值小于50 b.设置50<高阈值<100 c.设置100<高阈值<150 e.设置200<高阈值<250 程序代码: 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点. 2 // 3 //D:\\Work\\Work_Programming\\So