本文由烏合之衆 lym瞎編,歡迎轉載 my.oschina.net/oloroso
***
仍是先說一下當前的系統環境:Ubuntu 14.04 + Qt5.4
若是沒有安裝過QT,能夠安裝下面幾個qt軟件css
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函數鏈接信號的槽的時候,即使是槽函數不存在,也可以經過編譯。html
1. 先來寫源代碼
必須先寫源代碼,這個源代碼很簡單,就是建立一個Widget
,而後widget上面有一個PushButton
,點擊以後彈出一個MessageBox
來提示一個"hello world"。linux
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)
等。
這裏並不打算詳細介紹每個部分,只作簡單介紹c++
.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
由於咱們這裏比較簡單,就只寫須要的部分了。shell
# 使用到的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所提供的工具的主要連編工具。swift
qmake程序在Qt的安裝目錄下,好比個人機器上就在o@o-pc:~/program_files/Qt5.4.1/5.4/gcc_64/bin$
你能夠把這個路徑加入到系統環境變量的PATH變量中,這樣就能夠隨便使用了。我不喜歡加入到環境變量,因此這裏指定路徑來運行。app
若是沒有安裝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$