初次嘗試Linux下靜態編譯Qt應用程式
本來想發布我在Linux下編譯的程式,發現在沒有安裝Qt的Linux下無法跑。這怎麼辦呢?本來想將Qt相關的動態連結程式庫(尾碼名為so)複製到我的應用程式旁邊,然後一起發布的。我自己試了一下,基本所有的Qt程式都要libQtCore.so和libQtGui.so,但是不知道怎麼回事,我想這樣不方便,想自己編譯Qt原始碼,結果自己開始了靜態編譯Qt之路。
編譯Qt要到Qt官方下載原始碼。在這裡可以下載到Qt的原始碼(版本4.8.3),然後就像熟悉的tar.gz軟體一樣安裝。基本步驟是:cd./configuremakeinstallmake。我是看了一個高手的文章之後進行快速編譯的。他的文章是:這裡。
花了一晚上(不知道Qt準確的編譯的時間^_^),早上來看到已經編譯好了Qt了。其實根據我在Windows的多年經驗,我想要的是Qt的lib庫,詳細地說是靜態庫(尾碼名是a),因為我想靜態編譯Qt嘛。發現我的/home檔案夾只有50多M了!原來我粗心,把example和demo編譯了。尤其是example,有4個G!可惡,我果斷地把example檔案夾和demo檔案夾刪除了,包含bin、include和lib三個檔案夾還有一些不知何用的檔案夾總共加起來有一個G。還好。我想嘗試將靜態庫作為一個版本,讓QtCreator識別它。但是由於自己才疏學淺,不會相關的操作!今天我向Qt論壇提問了,看有沒有什麼結果。
接下來說說我自己是如何解決靜態編譯Qt應用程式的。這種方法我在別的地方沒有看過哦。比如說我想靜態編譯我即將發布的“紋理座標解算”程式,開始在pro檔案中僅僅添加了我項目所用的標頭檔和源檔案。
HEADERS += \ TCWidget.h \ TCCFrame.h \ SingleSelectActions.hSOURCES += \ TCWidget.cpp \ TCCFrame.cpp \ SingleSelectActions.cpp \ main.cpp
但是這分明是預設動態編譯方法嘛。我於是添加了一句“CONFIG+= static”。這怎麼行!我的靜態Qt版本還沒有被QtCreator識別呢。於是我想了一個辦法,自己連結Qt庫!
其實也算簡單。首先我添加了這兩行:
HEADERS += \ TCWidget.h \ TCCFrame.h \ SingleSelectActions.hSOURCES += \ TCWidget.cpp \ TCCFrame.cpp \ SingleSelectActions.cpp \ main.cppCONFIG += staticLIBS += /home/jiangcaiyang/QtSDK/Desktop/QtStatic/lib/libQtCore.a \ /home/jiangcaiyang/QtSDK/Desktop/QtStatic/lib/libQtGui.a
注意,LIBS +=有兩種方法,一種是使用gcc裡面的ld程式自己載入庫,也就是如果libQtCore.a在/usr/lib中,可以這麼寫:LIBS+= -lQtCore,首碼lib可以不用,還有一種則是直接指定靜態庫的路徑,我就是使用第二種方法。但是700多個錯誤!列印都不完!
注意到了嗎?這些庫函數都帶有頭的,於是我根據這些頭,猜想他們的庫檔案名稱,有些是libX11.a裡面的,有些是libXM.a裡面的,於是在.pro後面添加了這幾句:
HEADERS += \ TCWidget.h \ TCCFrame.h \ SingleSelectActions.hSOURCES += \ TCWidget.cpp \ TCCFrame.cpp \ SingleSelectActions.cpp \ main.cppCONFIG += staticLIBS += /home/jiangcaiyang/QtSDK/Desktop/QtStatic/lib/libQtCore.a \ /home/jiangcaiyang/QtSDK/Desktop/QtStatic/lib/libQtGui.a \ /usr/lib/i386-linux-gnu/libX11.a \ /usr/lib/i386-linux-gnu/libSM.a \ /usr/lib/i386-linux-gnu/libICE.a \ /usr/lib/i386-linux-gnu/libXext.a \ /usr/lib/i386-linux-gnu/libxcb.a \ /usr/lib/i386-linux-gnu/libXau.a \ /usr/lib/i386-linux-gnu/libXdmcp.a
最後竟然連結竟然成功了!只不過還是一個Bug,啟動並執行時候Ubuntu的Unity主題都沒了,而且字型非常難看!
此外還會出現這些錯誤:
QObject::setParent:Cannot set parent, new parent is in a different thread
QObject::startTimer:QTimer can only be used with threads started with QThread
QObject::setParent:Cannot set parent, new parent is in a different thread
QObject::startTimer:QTimer can only be used with threads started with QThread
QObject::setParent:Cannot set parent, new parent is in a different thread
QObject::startTimer:QTimer can only be used with threads started with QThread
QObject::setParent:Cannot set parent, new parent is in a different thread
QObject::startTimer:QTimer can only be used with threads started with QThread
QObject::setParent:Cannot set parent, new parent is in a different thread
QObject::startTimer:QTimer can only be used with threads started with Qthread
用命令提示字元,帶上style參數,像這樣:a-stylecleanlooks還是可以顯示其它的佈景主題效果的,但是就是沒有Unity佈景主題效果。看來還是編譯的時候出了問題,我再去查查問題。寫下這篇文章留作紀念。