初次嘗試Linux下靜態編譯Qt應用程式

來源:互聯網
上載者:User

初次嘗試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佈景主題效果。看來還是編譯的時候出了問題,我再去查查問題。寫下這篇文章留作紀念。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.