qt 在linux環境下的搭建 (自己整理)
想起自己當初剛開始學習Qt的那個苦惱,一開始不知道各個軟體之間的關係和安裝時具體為什麼這麼做,現在就把它總結一下,希望對大家有所幫助。
1. 硬體環境
A. 主機:x86系列PC機。
B. 開發板:博創2410-s。
C. 通訊連線:串列埠和網路。
2. 軟體環境
A. 主機作業系統:VMware虛擬機器下的Redhat linux 9.0(完全安裝) 。
B. 開發板作業系統:嵌入式Linux,核心版本為2.6.13。
C. 交叉編譯器:armv41-unknown-linux-c++。
D. 通訊方式:虛擬機器與主機(Windows XP)使用telnet、nfs、ftp、ssh等方式通訊,主機與開發板使用串列埠和網路(例如nfs)
3. 相關說明
A. 命令:所有以#開頭的均為在shell中執行的命令。
B. 交叉編譯器位置:/opt/host/armv41。
C. 工作目錄:預設為/root/linux-qt/s。
D. 指令碼註釋:均放在命令下一行的圓括號內。
4. 下載原始碼包
A. 工程管理tmake-1.13.tar.gz,用於生成Makefile。
B. Qt/X11軟體包qt-x11-2.3.2.tar.gz,用於生成qvfb等開發工具。
C. Qt/Embedded軟體包qt-embedded-2.3.10-free.tar.gz,Qt/Embedded圖形庫。[以上檔案都可以在網上很方便的獲得 ,當然這個版本搭建的環境是很低的了,我們只不過是用此來說明qt開發的環境在linux下的搭建方法和簡單使用。同時也瞭解一下linux系統和我們使用的軟體之間的關係]
5. 編譯前準備
A. 建立工作目錄
#mkdir /root/linux-qt
#cd /root/linux-qt
#cp …
(複製所有原始碼包到此目錄)
B. 解壓原始碼包
#cd /root/qt/
tar -zxvf tmake-1.13.tar.gz (此命令用於解壓此檔案)
解壓完後 在當前目錄生成一個 tmake-1.13目錄
tar -zxvf qt-x11-2.3.2.tar.gz (此命令用於解壓此檔案)
(解壓原始碼包到當前目錄)
為了以後方便,我們把這三個的名字改成容易記憶的命令名
解壓完後 在當前目錄生成一個 qt-2.3.2 目錄
tar -zxvf qt-embedded-2.3.10-free.tar.gz(此命令用於解壓此檔案)
解壓完後 在當前目錄生成一個 qt-2.3.10 目錄
#mv tmake-1.13 tmake (把tmake-1.13 目錄名改成tmake) #mv qt-2.3.2 qt-x11 (把 qt-2.3.2目錄名改成qt-x11)
#mv qt-2.3.10 qt-embedded(把qt-2.3.10 命令名改成qt-embedded)
二、搭建Qt/Embedded模擬開發環境
1. 安裝tmake
#cd /root/qt-linux/
#export TMAKEDIR=$PWD/tmake
#export TMAKEPATH = $PWD/tmake/ lib/qws/linux-x86-g++
(註冊好tmake的環境變數,這個能影響到你用tmake生成 工程檔案和Makefile。目錄不對可能生成的Makefile檔案不對)
將常用到的命令progen tmake 拷貝到bin目錄下。
cp progen /bin
cp tmake /bin
2. 安裝Qt/X11
#cd qt-x11
#export QTDIR=$PWD
(設定環境變數)
#./configure –static –no-xft –no-opengl –no-sm
(配置,回答yes)
#make (編譯)
#cp src/moc/moc bin
(複製moc工具到bin目錄,moc是根據你介面化設計的檔案生成工程檔案的工具)#cp tools/designer/designer bin
(編譯Designer,用於視覺化介面設計)3.建立qvfb使用環境
#export QTDIR=$PWD
#export PATH=$QTDIR/bin:$PATH
#export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
(這一步是為了建立了 Qt/Embedded 2.3.10到 Qt 2.3.2的靜態庫的連結。要用到tmake這個工具,因此先檢測你剛才設定的關於tmake的環境變數還有效嗎?如果沒有效,應該重新設定。檢測方法,echo $TMAKEPATH.若輸出的不是剛才安裝tmake時的路徑。要重新設定。咱一開始設定好了 ,一般沒事)
cd qt-x11/tools/qvfb
tmake -o Makefile qvfb.pro
make
cp qvfb /bin(複製qvfb到bin目錄去。其中
qvfb 工具用來生成 Virtual framebuffer,這是一個非常有用的工具,它可以模擬在開發板上的顯示情況,如果在 Virtual framebuffer中執行沒有問題的話,可以直接通過交叉編譯在開發板上執行。)
4. 編譯Qt/Embedded
#export QTDIR=$PWD/qt-embedded
#export PATH=$QTDIR/bin:$TMAKEDIR/bin: $PATH
#cd qt-embedded
(設定環境變數)#./configure –system-jpeg –gif –system-libpng –system-zlib –platform linux-generic-g++ -qconfig qpe –depths 16,24,32
(配置Qt/Embedded圖形庫,然後回答兩個yes,在配置./configure 中-qvfb用來支援 Virtual framebuffer,-depths 4,8,16,32 支援4 位,8位,16 位,32 位的顯示深度,此外還可以新增如-syestem-jpeg 和-gif 來提供對 jpeg 和 gif
的支援。配置系統同時還支援對特定平臺系統選項的新增,但一般來講,凡是支援framebuffer的 Linux 系統都可以使用“linux-generic-g++”平臺。詳細的配置資訊可以通過執行./configure --help 命令來檢視。 )
#make
(編譯Qt/Embedded)
5. 編寫環境變數指令碼
大家在以後使用tmake時可以看一下tmake最後生成的Makefile檔案。可以知道它生成的檔案全部環境變數都是咱們在安裝時指定的那些名字。因此在使用tmake和其他qt開發環境時應該先設定環境變數。
用此指令碼更改環境變數的方法:
shell 指令碼內容:
#shell
export QTDIR=$PWD/qt-embedded
# export QPEDIR=$PWD/qtopia
export TMAKEDIR=$PWD/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH
先把此檔案改成可執行檔案
1,source qt.sh
2,. qt.sh(用點代替 但點後有一空格)
好了到現在為止,你的qt開發和編輯環境已經搭建好了。
下面我們測試一下:
我們用qt庫函式寫一個簡單的視窗程式:
#cd /root/linux-qt
#mkdir hello
(在咱們的工作目錄下建一個hello目錄)
我們學一門語言時,一般我們要寫一個hello world 的程式,這次也不例外。呵呵
hello.cpp
//hello.cpp
1 #include <qapplication.h>
2 #include <qlabel.h>
3 int main(int argc, char *argv[])
4 {
5 QApplication app (argc, argv);
6 QLabel *hello = new QLabel("Hello Qt/Embedded!", 0);
7 app.setMainWidget(hello);
8 hello->show();
9 return app.exec();
10 }
現在開始逐行講解一下每一句是什麼意思,掌握了這些以後可以幫助我們更加了解 Qt
的程式設計。
第 1 行和第 2 行包含了兩個標頭檔案,這兩個標頭檔案中包含了 QApplication 和 QLabel
類的定義。
第 5 行建立了一個 QApplication 物件,用於管理整個程式的資源,它需要 2 個引數,
因為 Qt 本身需要一些命令列的引數。
第 6 行建立了一個用來顯示 Hello Qt/Embedded!的部件。在 Qt 中,部件是一個視覺化
使用者介面,按鈕、選單、滾動條都是部件的例項。部件可以包含其它部件,例如,一個應
用程式視窗通常是一個包含 QMenuBar、QToolBar、QStatusBar 和其它部件的一個部件。
在 QLabel 函式中的引數 0 表示,這是一個視窗而不是嵌入到其它視窗中的部件。
第 7 行設定hello 部件為程式的主部件,當用戶關閉主部件後,應用程式將會被關閉。
如果沒有主部件的話,即使使用者關閉了視窗程式也會在後臺繼續執行。
第 8 行使hello 部件可視, 一般來說部件被建立後都是被隱藏的,因此可以在顯示前根
據需要來訂製部件,這樣的好處是可以避免部件建立所造成的閃爍。
第 9 行把程式的控制權交還給 Qt,這時候程式進入就緒模式,可是隨時被使用者行為
啟用,例如點選滑鼠、敲擊鍵盤等。
下面我們要讓我們的程式跑起來,首先要讓它能夠在 Virtual framebuffer中顯示出來,
然後再通過交叉編譯在開發板上執行。
下面,我們就用這個檔案來生成工程檔案和Makefile檔案。
首先,我們執行剛才寫的指令碼qt.sh
1.生成工程檔案(.pro)
每一個 Qt 程式都對應著一個工程檔案,因為 tmake 工具要藉此工程生成相應的
Makefile 檔案。生成工程檔案需要使用 progen 工具,它的位置在$TMAKEDIR/bin 下,使
用 progen 生成工程檔案的方法如下:
progen –t app.t –o hello.pro
生成的這個 hello.pro 工程檔案是可以被修改的,可以編輯裡面的標頭檔案、原始檔等內
容。
2.生成 Makefile 檔案
Qt 提供了生成 Makefile檔案的工具 tmake,這極大地方便了應用程式的開發,節
大量的時間,而且還可根據不同平臺的需要生成適合於不同平臺的 Makefile 檔案。
export QTDIR=$PWD/qt
export TMAKEDIR=$PWD/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH
然後,我們讓這個程式在Virtual framebuffer顯示.
tmake –o Makefile hello.pro
完成上面的步驟以後就可以在當前的目錄中生成一個 Makefile 檔案,關於 Makefile
檔案的功能和結構這裡就不再做過多的介紹了,可以參考前面的章節來了解 Makefile。 【這次,我們只是在我們機器上做一個測試,我把我的機器上生成的 Makefile 的檔案放在這裡:
1 ######################################################################## #####
2 # Makefile for building hello
3 # Generated by tmake at 08:24, 2011/04/27
4 # Project: hello
5 # Template: app
6 ######################################################################## #####
7
8 ####### Compiler, tools and options
9
10 CC = g++
11 CXX = g++
12 CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG
13 CXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -DNO_ DEBUG
14 INCPATH = -I$(QTDIR)/include
15 LINK = g++
16 LFLAGS =
17 LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm -lqte
18 MOC = $(QTDIR)/bin/moc
19 UIC = $(QTDIR)/bin/uic
20
21 TAR = tar -cf
22 GZIP = gzip -9f
23
24 ####### Files
25
26 HEADERS =
27 SOURCES = hello.cpp
28 OBJECTS = hello.o
29 INTERFACES =
30 UICDECLS =
31 UICIMPLS =
32 SRCMOC =
33 OBJMOC =
34 DIST =
35 TARGET = hello
36 INTERFACE_DECL_PATH = .
37
38 ####### Implicit rules
39
40 .SUFFIXES: .cpp .cxx .cc .C .c
41
42 .cpp.o:
43 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o [email protected] $<
44
45 .cxx.o:
46 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o [email protected] $<
47
48 .cc.o:
49 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o [email protected] $<
50
51 .C.o:
52 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o [email protected] $<
53
54 .c.o:
55 $(CC) -c $(CFLAGS) $(INCPATH) -o [email protected] $<
56
57 ####### Build rules
58
59
60 all: $(TARGET)
61
62 $(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC)
63 $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
64
65 moc: $(SRCMOC)
66
67 tmake: Makefile
68
69 Makefile: hello.pro
70 tmake hello.pro -o Makefile
71
72 dist:
73 $(TAR) hello.tar hello.pro $(SOURCES) $(HEADERS) $(INTERFACES) $ (DIST)
74 $(GZIP) hello.tar
75
76 clean:
77 -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $( TARGET)
78 -rm -f *~ core
79
80 ####### Sub-libraries
81
82
83 ###### Combined headers
84
85
86 ####### Compile
87
88 hello.o: hello.cpp
89
】
最後在命令列中輸入 “make”命令就可以對整個程式進行編譯連結了,最終生成了一
hello 可執行檔案。
#cd hello
#qvfb &
#./hello -qws
就可以看到我們剛才做的一個簡單的視窗。
(注意,你的linux主機需支援x-window,在介面模式下用 terminal 輸入這些命令)
好了,到目前為止,你已經搭建了一個在x86 機器的qt的整個執行平臺。在x86上用frame buffer 執行qt程式了。那麼,接下來就應該建立arm板子的qt庫檔案了。也就是如果你想把你的qt程式移植到arm板子上的話。你還應該用交叉編譯器重新編譯qt-embedded原始檔,也就是編譯成arm執行時所需要的庫檔案。我用的交叉編譯器是arm-linux-gcc -3.4.1 。步驟如下:
1. Build Qt/Embedded
cd $QTEDIR
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
export QTDIR=$QTEDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -xplatform linux-arm-g++ -no-xft -no-qvfb -depths 4,8,16,32
make
如果make過程出現錯誤,要到網上去搜一搜相關的錯誤資訊。因為出現錯誤的原因是在是很多,這裡就不一一列舉。
好了,編譯成功後。
進入 當前目錄的 lib 你會看到你剛才編譯的庫檔案。
你用 file命令來檢視一下檔案屬性:
file libqte.so.2.3.10
libqte.so.2.3.10: ELF 32-bit LSB shared object, ARM, version 1 (ARM), not stripped
如出現上面的資訊,則說明你編譯的arm的qt庫是可以使用的。呵呵 ,先祝賀一下。
大家,知道我們的qt程式在arm板子上跑起來需要這些庫檔案。所以我們把檔案複製到arm板子上。
我們使用nfs 的mount 命令來做。
先給大家說一下我的開發具體的環境。在windows下的虛擬機器上安裝了一個red hat 9.0 。red hat 9。0 的ip是 114.214.1.100 netmask 255.255.0.0 然後我的red hat 上開啟nfs功能 ,我的共享目錄是 /arm2410
所以,我用命令
mount 114.214.1.100:/arm2410 /var/tmp 我把我的共享檔案掛載到 我的arm板子的 /var/tmp 上。
首先,我們把剛才編譯好的qt的庫先複製到共享目錄 /arm2410 中去。
然後,我們用arm-linux-gcc 重新編譯一下咱們上面用的hello world 程式。
具體,編譯方法就是更改一下 原來的Makefile 檔案。把 編譯器改成arm-linux-gcc 和連結庫檔案的目錄改成你剛編譯好的庫檔案目錄。
然後把生成的可執行檔案複製到共享目錄 /arm2410 中去。
好了,我們直接進入 /var/tmp 去 執行 hello
錯誤提示:找不到libqte.so.2.3.10檔案
錯誤分析:arm板子執行時有一個關於庫的搜尋路徑的變數,變數代表的路徑裡沒有你的庫所在路徑。
解決方法:把你qt庫所在位置新增到你的環境變數裡。export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/var/tmp(因為我的qt庫檔案在這個目錄)。
接下來在執行一下 hello
提示錯誤:找不到 arm-linux-g++ 的一個庫檔案(原錯誤沒有記錄下來,這只是個大概意思)。
分析原因,你用的arm-linux-gcc 編譯器的庫檔案在你red hat 裡 ,所以在arm板子上執行時找不到此庫檔案。
解決方法:找到你arm-linux-gcc 編譯器的庫位置,把所有的庫檔案都拷貝到共享目錄下。
然後執行hello
又提示錯誤:Cannot create Qt/Embedded data directory: /tmp/qtembedded-0
錯誤分析:qt程式在arm板子上執行時需要建立這個目錄,呵呵,這個錯誤對我們來說是一件好事,起碼說明這個程式能運行了,只不過在執行時建立目錄失敗而已。
解決方法:在板子上建立這個目錄,因為我用的板子的檔案系統是隻讀的,不能直接建立目錄。而且在檔案系統上的根目錄下有一個連結檔案tmp 它連結的目錄是/mny/yaffs/Qtopia 因此,我們的一個解決方案是把/mny/yaffs/Qtopia目錄掛載成我們redhat的共享目錄,在共享目錄裡建一個tmp資料夾。這樣就解決了不能建立目錄的問題。因為arm板子上的程式再執行時,建立目錄是在red hat 中建立的。呵呵呵
再接著執行hello 程式。
呵呵呵
久違的hello world 程式終於出現在arm板子上了 。
板子的檔案系統是不可寫的,解決上面的問題,當然還有一種更徹底的方案:
就是按照上面所需要的檔案和目錄再重新制作一個根檔案系統。(具體的製作方法以後再說)
呵呵
arm板子的簡單qt 開發、執行環境終於搭建好了!!!!!!!!!!
相關推薦
qt 在linux環境下的搭建 (自己整理)
想起自己當初剛開始學習Qt的那個苦惱,一開始不知道各個軟體之間的關係和安裝時具體為什麼這麼做,現在就把它總結一下,希望對大家有所幫助。 1. 硬體環境 A. 主機:x86系列PC機。 B. 開發板:博創2410-s。 C. 通訊連線:串列埠和網路。 2. 軟體環境 A. 主
Linux 環境下搭建 Jenkins(Hudson)平臺
效果 swd gpo conf 有一個 信息 hudson track 文件 安裝jenkins:安裝 jenkins 有兩種方式:安裝方式一: [java] view plain copy sudo java -jar jenkins.war –htt
測試環境搭建和部署(在Linux環境下搭建jdk+Tomcat+mysql環境和項目包的部署)
pri 環境 安裝包 mysq 自己 進行 配置jdk linu 連接數 1.Linux環境(我搭建的是64位centos版本的linux系統) 1.下載並安裝一個VMware Workstation虛擬機,是搭建Linux系統的平臺。 2.下載一個
在linux環境下搭建java web測試環境(非常詳細!!)
一.專案必備軟體及基本思路 專案必備:虛擬機器:VMware Workstation (已安裝linux的 CentOS6.5版本) 專案:java web專案 (必須在本地部署編譯後選擇專案的webRoot,改為ROOT(ROOT包含下面四個關鍵檔案),放到tomcat下的webapps
Linux環境下搭建Apache伺服器(完整版)
Linux下搭建Apache伺服器(完整版) 什麼是Apache? Apache Licence是著名的非盈利開源組織Apache採用的協議。該協議和BSD類似,同樣鼓勵程式碼共享和尊重原作者的著作權,同樣允許程式碼修改,再發布(作為開源或商業軟體)。需要
linux環境下搭建Jenkins持續整合(Jenkins+git+shell+maven+tomact)
準備環境 jenkins.war包 ,jdk1.8 ,tomact , maven,git 1.Jenkins war包,下載地址https://jenkins.io/zh/download/ ,當然你可以通過wget 下載, 也可以通過xftp遠端傳輸 2.
linux環境下搭建MySQL
啟動mysql charset serve spool arm bundle mes SQ sign linux下搭建mysql的方式很多,網上也詳解了很多種搭建方式,有直接yum的、有rpm的、、總之,“坑”是層出不窮,有相關文件依賴性、權限、GPG keys等等。 本人
linux環境下搭建MySQL數據庫的雙擊熱備
RoCE offset 可能 引入 The repl chang 操作系統 lis 準備服務器 由於Mysql不同版本之間的(二進制日誌)binlog格式可能會不太一樣,因此最好的搭配組合是主(Master)服務器的Mysql版本和從(Slave)服務器版本相同或者更低,
linux環境下搭建Go語言開發環境並設定語法高亮
這個部落格是我自己從頭開始搭建,在設定語法高亮的時候碰到了很多問題,主要原因嘛,就是網上搜索很多東西,大多都是同樣的內容,但是根據這個內容根本搭建不出Go語言的開發環境,為了給大家減少不必要的麻煩,現在我以我搭建的過程給大家講一下。 我使用的環境是CentOS6.5版,使用的是虛擬機器版本,
Linux環境下搭建VPS服務
說明 由於大部分VPN被封,FQ過程中無意間接觸到了VPS(Virtual Private Server 虛擬專用伺服器,可用於FQ),所以簡單記錄下VPS服務搭建流程。 此教程基於centos7,本人選擇使用阿里雲伺服器(香港區域,可訪問外網)進行搭建。 安裝元件 安裝pyt
linux環境下搭建自動化Jenkins管理工具
一、搭建一個jak--tomcat伺服器到自己的linux伺服器上 具體的伺服器搭建這裡可以參考華華大佬的部落格:https://www.cnblogs.com/liulinghua90/p/4661424.html 二、 如果通過http:ip地址:埠在瀏覽器訪問出現下 說明
簡單易學!win10環境下TensorFlow(CPU版)快速搭建
1 背景 筆者本身不是學此相關專業,學校作業要求用到TensorFlow,所以需要快速搭建環境(本身電腦顯示卡也不行),然後寫作業,百度了很多部落格,但都沒有找到十分貼合的,總是報錯,錯誤原因:輸入import TensorFlow報:“找不到指定的模組” 目前問題已經解決,希望能給剛剛
linux環境下搭建禪道管理系統
vmware Linux: Centos 6.7禪道安裝包:ZenTaoPMS.10.0.stable.zbox_64.tar.gz將安裝包放在/opt目錄下並解壓tar -zxvf ZenTaoPMS.10.0.stable.zbox_64.tar.gzcd /zbox./
在linux環境下搭建memcached叢集(一)
一,準備工作 下載所需要的安裝包: memcached支援軟體:libevent memcached 叢集管理軟體:magent 連線到linux機器,將檔案拷貝上去。 二,開始安裝 1.安裝libevent: a.解壓libevent: tar -zxvf libe
linux環境下搭建一個基於tcp的客戶端和伺服器
客戶端 //TCP 客戶端程式碼 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #in
Linux環境下搭建jenkins平臺
1.下載jenkins.war包 2.使用Xshell 5工具通過SSH連線到linux伺服器,在/usr/local下新建一個jenkins目錄,用來存放jenkins.war包:mkdir jenkins 3.使用Xftp工具將jenkins.war拖到/usr/loc
linux 環境下搭建django開發環境
Django是網站開發不錯的框架,使用python可以快速方便的搭建網站開發環境,如果想快速學習Django,“the django book”是一個不錯的選擇,下邊簡介一下linux下搭建django開發環境。 1. pyhton安裝 當下大部分的Mac和Linux系統中
Linux環境下軟體(庫)的更新命令
$ sudo apt-get install/delete package$ sudo apt-get -f install #修復安裝$ sudo apt-get dist-upgrade
Windows和Linux環境下搭建SVN伺服器
--------------------------Windows下搭建SVN伺服器----------------------------- 一、安裝SVN服務端 軟體包Setup-Subversion-1.8.17.msi,下載地址:https://source
在suse Linux環境下搭建ES叢集
想成長為大牛的小白心血帖 虛擬機器:virtualbox 系統:suse Linux 11 sp3 elasticsearch:5.6.4 kibana:5.6.4 一.安裝jdk1.8 參考:ht