qt編譯如何保證庫順序
㈠ Qt下如何編譯庫
一般分為動態庫和靜態庫,方法分別如下:
一.
靜態庫的生成
1.
測試目錄:
lib
2.
源碼文件名:
mywindow.h,
mywindow.cpp
3.
編寫項目文件:
mywindow.pro
注意兩點:
TEMPLATE
=
lib
CONFIG
+=
staticlib
4.
生成Makefile:
qmake
mywindow.pro
5.
編譯生成靜態庫libmywindow.a
make
二.
靜態庫的使用
1.
測試目錄:
test
2.
將mywindow.h與libmywindow.a拷貝至test目錄下
3.
編寫main.cpp,
包含頭文件mywindow.h,
並調用MyWindow類
4.
編寫項目文件:
test.pro
注意加上庫路徑與庫文件名:
LIBS
+=
-L
./
-lmywindow
5.
生成Makefile:
qmake
test.pro
6.
編譯:
make
7.
運行:
./test
三.
動態庫的生成
動態庫編譯基本和靜態庫類似,需要將上述將要進行編譯的項目文件.pro中下面這行去掉
CONFIG
+=
staticlib
按上述操作編譯完後就可以得到以lib開頭並且.so*
結尾動態庫文件,一般有多個。
㈡ Qt 澶氶」鐩綆$悊
棣栧厛鏄鍏堟柊寤轟竴涓瀛愮洰褰曢」鐩錛屽啀鏍規嵁闇瑕佸湪瀛愮洰褰曢」鐩涓娣誨姞涓涓搴旂敤紼嬪簭欏圭洰浠ュ強澶氫釜搴撶殑欏圭洰錛屽瓙鐩褰曢」鐩榛樿ゅ氨鍙鏈変竴涓.pro鏂囦歡銆
浠庘#鈥濆紑濮嬶紝鍒拌繖涓琛岀粨鏉熴
妯℃澘鍙橀噺鍛婅瘔qmake涓鴻繖涓搴旂敤紼嬪簭鐢熸垚鍝縐峬akefile銆
鎸囧畾緙栬瘧鍣ㄩ夐」鍜岄」鐩閰嶇疆錛屽肩敱qmake鍐呴儴璇嗗埆騫跺叿鏈夌壒孌婃剰涔夈
浠ヤ笅閰嶇疆鍊兼帶鍒剁紪璇戞爣蹇楋細
qmake娣誨姞榪欎釜鍙橀噺鐨勫間綔涓虹紪璇戝櫒C棰勫勭悊鍣ㄥ畯(-D閫夐」)銆
鎸囧畾緙栬瘧欏圭洰鏃跺簲璇ヨ鎼滅儲鐨#include鐩褰曘
鎸囧畾紼嬪簭緙栬瘧鏃朵緷璧栫殑鐩稿叧璺寰勩
鎸囧畾鍦ㄤ綍澶勬斁緗鐩鏍囨枃浠躲
鎸囧畾鐩鏍囨枃浠剁殑鍚嶇О銆傞粯璁ゆ儏鍐典笅鍖呭惈鐨勯」鐩鏂囦歡鐨勫熀鏈鍚嶇О銆
鎸囧畾鏋勫緩鐩褰曘
鎸囧畾鏉ヨ嚜moc鐨勬墍鏈変腑闂存枃浠舵斁緗鐨勭洰褰曪紙鍚玅_OBJECT瀹忕殑澶存枃浠惰漿鎹㈡垚鏍囧噯.h鏂囦歡鐨勫瓨鏀劇洰褰曪級銆
鎸囧畾鎵鏈変腑闂存枃浠.o錛.obj錛夋斁緗鐨勭洰褰曘
鎸囧畾Qt璧勬簮緙栬瘧鍣ㄨ緭鍑烘枃浠剁殑鐩褰曪紙.qrc鏂囦歡杞鎹㈡垚qrc_*.h鏂囦歡鐨勫瓨鏀劇洰褰曪級銆
鎸囧畾閾炬帴鍒伴」鐩涓鐨勫簱鍒楄〃銆-L鍚庢槸搴撴枃浠剁殑鐩褰曪紝-l鍚庢槸鍏蜂綋鐨勫簱鐨勫悕瀛(鍚庣紑涓嶇敤鍔)銆備緥濡傦細
LIBS += -L$$PWD/../../../ThirdLib/winapi -lWSock32
浠呴傜敤浜嶹indows錛屾寚瀹氱殑鍥炬爣搴旇ュ寘鍚鍦ㄤ竴涓鐢熸垚鐨.rc鏂囦歡閲屻傚傛灉RC_FILE 鍜孯ES_FILE鍙橀噺閮芥病鏈夎劇疆榪欐墠鍙鍒╃敤銆
鎸囧畾鍖呭惈鐢ㄦ埛鐣岄潰緲昏瘧鏂囨湰鐨勭炕璇(.ts)鏂囦歡鍒楄〃銆
涓篧indows騫沖彴鍔犵殑渚濊禆騫沖彴鐨勬枃浠剁殑綆鍗曠殑浣滅敤鍩熺湅璧鋒潵灝卞儚榪欐牱錛
win32 { SOURCES += hello_win.cpp }
姣忔℃坊鍔犱竴涓瀛愰」鐩灝變細鍦⊿UBDIRS欏圭洰鍔犱笂涓涓欏圭洰鍚嶏紝瀛愮洰褰曢」鐩鐨 TEMPLATE = subdirs 銆 CONFIG += ordered 鏄璁╅」鐩鎸夌収欏哄簭緙栬瘧錛岀敱浜庝富紼嬪簭渚濊禆浜庡瑰簲鐨勫簱錛屼竴鑸閮芥槸鎶奙ainApp鏀懼湪SUBDIRS鐨勬渶鍚庛
瀵逛簬涓浜涘簱鍜屼富紼嬪簭閮介渶瑕佺殑鐩褰曡劇疆 (鏋勫緩鐩褰曘乷bj鐢熸垚鐩褰曘乵oc鏂囦歡鐢熸垚鐩褰曠瓑)錛屽彲浠ョ粺涓鍐欏湪涓涓猵ri鏂囦歡涓錛
鍦ㄩ渶瑕佸紩鐢ㄧ殑pro鏂囦歡涓錛
include($$PWD/../../../Path.pri)
message($$INCLUDEPATH) , 浼氬湪姒傝佷俊鎮涓鎵撳嵃鐩稿叧鍙橀噺鐨勫
涓葷▼搴忕殑 TEMPLATE = app 銆傞櫎浜嗗父瑙勭殑pro璁劇疆澶栵紝瑕佽板緱灝嗚嚜宸辯紪鐨勫簱鐨勫ご鏂囦歡鐩褰曞姞涓婏紝騫跺皢鐢熸垚鐨刣ll閫氳繃LIBS閾炬帴錛
搴撶殑 TEMPLATE = lib 銆傚簱鍦ㄩ氳繃Creator鏂板緩鐨勬椂鍊欎細鐢熸垚涓涓獂xx_global.h錛屽畾涔変簡瀵煎嚭搴撶殑鐩稿叧淇℃伅錛
鍦ㄥ簱涓瑕佷綔涓烘帴鍙g殑綾昏板緱鍔犱笂瀵瑰簲鐨勫畯錛
class TESTLIBSHARED_EXPORT TestLib : public QObject
闈欐佸簱璨屼技涓嶉渶瑕佽繖涓錛屽緟嫻嬭瘯...
㈢ 如何編譯動態庫/靜態庫之編譯Qt4.8.5靜態庫
1. 下載Qt 。需要注冊一下賬號!
a) 選擇你需要的版本
㈣ CodeBlocks 如何搭建一個編譯Qt程序的環境
你肯定也是照著這個做的吧
http://www.qtcn.org/bbs/read.php?tid=11847
你是到哪一步不行的?
㈤ 命令行編譯qt程序 有幾種方式
一、環境配置
1
要想使用Qt進行命令行編譯,環境配置是必不可少的一步。環境配置好以後,我們才能使用相應的qmake,nmake等命令,並且鏈接到編譯程序時所需要的頭文件和庫文件。
小提示:為了幫助大家解決環境配置的問題,新版Qt已經自帶了相應的批處理文件,我們只要在編譯前執行對應的批處理文件即可。
2
首先,我們在命令行編譯時需要運行qmake.exe,因此我們需要將該文件的路徑添加到PATH變數中。要想做到這一點,我們只需要執行Qt安裝目錄下的
Qt5.5.1\5.5\msvc2013\bin\qtenv2.bat 批處理即可。
3
其次,在編譯過程中,我們還需要用到nmake命令,並且鏈接相應的頭文件和庫文件,以生成最終的可執行程序。要想做到這一點,我們只需要執行VS安裝目錄下的
D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat批處理即可。
注意:由於我安裝的是Qt for VS2013 32位版,所以運行的是vcvars32.bat,如果你安裝的是64位版,請運行vcvars64.bat。
4
至此,環境配置就大功告成了。關於這個環境配置,需要特別指出的是,這個配置是臨時性的,只在當前命令行窗口有效;也就是說,你關閉命令行窗口後,均需要重新運行相應的批處理文件。
END
二、命令行編譯
首先,將以上兩個批處理文件復制到要編譯的工程目錄中。
然後,點擊菜單「文件」-「打開命令提示符」,在該目錄下打開命令行窗口。
執行批處理文件qtenv2.bat。注意,由於該批處理會跳轉到Qt安裝目錄,我們執行完畢後需要回到我們的當前目錄(我這里由於Qt安裝目錄與當前目錄不在同一個磁碟,只要切換磁碟便回到當前目錄了)。
執行批處理文件vcvars32.bat。
下面,正式開始編譯。首先,生成工程文件。鍵入命令:
qmake -project
說明:生成的工程文件名會與你當前的目錄名同名。例如,我當前的目錄名為test,生成的工程名則為test.pro。
接著,輸入qmake test.pro,生成相應的Makefile文件。
最後,鍵入nmake,生成最終的可執行文件。
㈥ Qt交叉編譯遇到的問題
QT相關的安裝軟體包:
(1) tmake-1.13.tar.gz (編譯工具,如progen與tmake)
(2) qt-embedded-2.3.7.tar.gz (提供了qte的庫)
(3) qt-x11-2.3.2.tar.gz (為了生成相應的QT工具,如designer和qvfb等)
(4) qtopia-free-1.7.0.tar.gz (QTE的桌面環境程序)
(5) cross-3.3.2.tar.bz2 (交叉編譯工具)
一、安裝工具
1 安裝 tmake
在 linux 命令模式下運行以下命令:
tar xfz tmake-1.11.tar.gz
export TMAKEDIR=$PWD/tmake-1.11
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
export PATH=$TMAKEDIR/bin:$PATH
2 安裝 Qt/Embedded 2.3.7
在 Linux 命令模式下運行以下命令:
tar xfz qt-embedded-2.3.7.tar.gz
cd qt-2.3.7
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure –qconfig local–qvfb -depths 4,8,16,32
make sub-src
cd ..
上述命令 ./configure -qconfig -qvfb -depths 4,8,16,32 指定 Qt 嵌入式開發包生成虛擬緩沖幀工具qvfb,並支持 4,8,16,32 位的顯示顏色深度。另外我們也可以在 configure 的參數中添加-system-jpeg 和 gif,使 Qt/Embedded 平台能支持 jpeg、gif 格式的圖形。
上述命令 make sub-src 指定按精簡方式編譯開發包,也就是說有些 Qt 類未被編譯。Qt 嵌入式開發包有 5種編譯范圍的選項,使用這些選項,可控制 Qt 生成的庫文件的大小,但是您的應用所使用到的一些 Qt 類將可能因此在 Qt 的庫中找不到鏈接。編譯選項的具體用法可運行./configure -help 命令查看。
在這一過程的configure中出現了問題:有一個變數沒有聲明,發現是少了一個頭文件,加上即可,make順利通過,看到了enjoy!
3 安裝 Qt/X11 2.3.2
在 Linux 命令模式下運行以下命令:
tar xfz qt-x11-2.3.2.tar.gz
cd qt-2.3.2
export QTDIR=$PWD
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure -no-opengl
make
make -C tools/qvfb
mv tools/qvfb/qvfb bin
cp bin/uic $QTEDIR/bin
cd ..
根據開發者本身的開發環境,也可以在 configure 的參數中添加別的參數, 比如-no-opengl 或-no-xfs,可以鍵入./configure -help 來獲得一些幫助信息。
在這個安裝過程中也出現了很多錯誤,典型的就是在make過程中:
/usr/local/qt-2.3.2/include/qvaluestack.h:57: error: cannot convert 'QValueListIterator<QMap<QString, QString> >' to 'const char*' for argument '1' to 'int remove(const char*)'
/usr/local/qt-2.3.2/include/qvaluestack.h: In member function 'T QValueStack<T>::pop() [with T = QString]':
xml/qxml.cpp:2502: instantiated from here
/usr/local/qt-2.3.2/include/qvaluestack.h:57: error: cannot convert 'QValueListIterator<QString>' to 'const char*' for argument '1' to 'int remove(const char*)'
make[2]: *** [xml/qxml.o] Error 1
make[2]: Leaving directory `/usr/local/qt-2.3.2/src'
make[1]: *** [sub-src] Error 2
make[1]: Leaving directory `/usr/local/qt-2.3.2'
make: *** [init] Error 2
這個錯誤是說,在文件qvaluestack.h的57行出錯。改正方法是修改文件qt-2.3.2/ include/qvaluestack.h的 第57行,將remove( this->fromLast() );改為 this->remove( this->fromLast() );
修改時可能要更改文件許可權,變成可寫的,chmod 666 qvaluestack.h。然後make順利通過,看到了enjoy。
二、交叉編譯 Qt/Embedded 的庫
開發居於 Qt/Embedded 的應用程序要使用到 Qt/Embedded 的庫,編寫的 Qt 嵌入式應用程序最終是在YLE270開發板上運行的,因此在把 Qt 嵌入式應用程序編譯成支持 YLE270 的目標代碼之前,需要兩樣東西,一個是 arm9 的 linux 編譯器,另一個是經 arm9 的linux 編譯器編譯過的 Qt/Embedded 的庫。安裝交叉編譯工具 cross-3.3.2 前面已經安裝過了。
這一步主要是配置 Qt/Embedded2.3.7 的安裝,Qt/Embedded 的安裝選項有很多個,您可以在命令行下直接輸入「./configure」來運行配置,這時安裝程序會一步一步提示你輸入安裝選項。您也可以在「./configure」後輸入多個安裝選項直接完成安裝的配置。在這些選項中有一個選項決定了編譯 Qt/Embedded 庫的范圍,即可以指定以最小,小,中,大,完全 5 種方式編譯 Qt/Embedded 庫。另外 Qt/Embedded 的安裝選項還允許我們自己定製一個配置文件,來有選擇的編譯 Qt/Embedded 庫,這個安裝選項是「-qconfig local」 ;當我們指定這個選項時,Qt/Embedded庫在安裝過程中會尋找qt-2.3.7/src/tools/qconfig-local.h 這個文件,如找到這個文件,就會以該文件裡面定義的宏,來編譯鏈接 Qt/Embedded 庫。
具體過程如下:
cd qt-2.3.7
export QTDIR=$PWD
export QTEDIR=$QTDIR
make clean
./configure –xplatform linux-arm-g++ -shared –debug (接下行)
-qconfig local -qvfb -depths 4,8,16,32
make
cd ..
在make中出現了錯誤,有變數沒有聲明,原來是優龍公司為了避免初學者在一開始就直接接觸到 Qt/Embedde 的復雜的宏編譯選項,把這些宏定義到一個名為 qconfig-local.h的安裝配置文件中,在安裝 Qt/Embedded 的時候,需要把這個文件復制到 Qt/Embedded 的安裝路徑的/src/tools 子路徑下,
cp /配置文件所在路徑/qconfig-local.h ./src/tools
make順利通過,看到了enjoy。
最後就可以在命令行下輸入make 命令對整個工程進行編譯鏈接了,在這里,要把過程中產生的文件放在同一個文件夾裡面,方便應用。
在最後make完畢以後我還是遇到了一個問題,就是生成的可執行文件不能運行,運行時提示:./hello cannot execute binary file,當然不能直接在自己的主機上運行了,因為生成的二進制文件要下到板子上運行的。接上液晶屏,板子上電,把生成的可執行文件下載到板子上,要chmod一下,不然許可權不夠,終於在液晶屏上看到了自己弄的小程序,好開心!
三、添加一個 Qt/Embedded 應用到 QPE
以hello,world!為例
1 在工作的機器上解包 qtopia
tar zxvf qtopia-free-1.7.x.tar.gz
cd qtopia-free-1.7.x
export QTDIR=$QTEDIR
export QPEDIR=$PWD
export PATH=$QPEDIR/bin:$PATH
注意在上面已經設定環境變數 QPEDIR 為 QPE 的安裝(解包)路徑。
2 建立 Hello,World 的例子程序的圖標文件
方法是:製作一個 32 X 32 大小的 PNG 格式的圖標文件,將該文件存放在$QPEDIR/pics/inline 目錄下,然後使用以下命令將$QPEDIR/pics/inline 目錄下的所有圖形文件轉換成為一個 c 語言的頭文件,這個頭文件包含了該目錄下的圖形文件的 rgb 信息。
qembed --images $QPEDIR/pics/inline/*.*
> $QPEDIR/src/libraries/qtopia/inlinepics_p.h
3 交叉編譯 qtopia
在$QPEDIR 路徑下,運行以下命令
cd src
./configure –platform linux-arm-g++
make
cd ..
在這一過程中也出現了比較大的錯誤,在make的時候又出現了error,是resource.cpp的174行的變數qembed_findImage沒有聲明,考慮到以前遇到的情況,推斷可能是少了某個頭文件,但是又不知道是哪一個,google了很久都沒有找到解決辦法,沒辦法只好點開src/libraries/qtopia下面的每一個頭文件看了一遍,還是沒有發現有含有這個變數的文件,繼續google,然後發現了inlinepics_p.h中包含qembed_findImage,於是vi /usr/local/qtopia-free-1.7.0/src/libraries/qtopia/inlinepics_p.h,發現inlinepics_p.h是空白的,原來是
qembed --images $QPEDIR/pics/inline/*.*
> $QPEDIR/src/libraries/qtopia/inlinepics_p.h
出了錯誤,重新操作一遍這一步,再查看inlinepics_p.h,發現正常了,要繼續交叉編譯qtopia:
make clean
./configure –platform linux-arm-g++