• qmake的使用


    本文由乌合之众 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$ 
    

    下面来看一下运行效果

    hello

  • 相关阅读:
    主席树模板之区间问题
    简易版第k大(权值线段树+动态开点模板)
    Irrigation
    Petya and Array
    H. Pavel's Party(权值线段树)
    权值线段树入门
    位数差(二分)
    ZYB's Premutation(树状数组+二分)
    单调队列入门
    javaBean为什么要implements Serializable?
  • 原文地址:https://www.cnblogs.com/oloroso/p/4595181.html
Copyright © 2020-2023  润新知