簡體   English   中英

在Ubuntu 12.04上構建靜態Qt 4.8.1

[英]Static Qt 4.8.1 Build on Ubuntu 12.04

由於可移植性問題,我試圖構建一個幾乎靜態的應用程序。 我希望能夠在幾個64位linux發行版上運行該可執行文件。 我已經成功地靜態鏈接了Qt並使用靜態鏈接的libstdc ++和libgcc進行了構建。

但是,我有一些第三方圖書館的問題。 我使用-qt-zlib構建了Qt,但最終應用程序仍與系統zlib動態鏈接。 我特別配置了:

./configure -static -nomake demos -nomake examples -nomake tools -release -no-webkit -qt-zlib -no-gif -qt-libtiff -qt-libpng -qt-libmng -qt-libjpe

假定應用程序能夠鏈接到Qt的靜態構建的zlib,我刪除了該應用程序中所有鏈接到zlib的引用。 在我看來,Qt幾乎忽略了-qt-zlib標志,而是使用系統庫,然后我的應用程序也使用該系統庫。

此外,我必須安裝libfontconfig-dev軟件包,這樣從源構建后的字體就不會太恐怖了,但是現在Qt也可以動態鏈接到它了。 如您所見,我嘗試鏈接到libfontconfig的靜態庫,但是因為Qt已經鏈接到libfontconfig,所以鏈接程序會忽略它。 在Qt構建過程中,有沒有一種方法可以指定不動態鏈接到第三方庫?

我不希望Qt的任何依賴項都被靜態鏈接。 現在,我相信該應用程序至少可以在Ubuntu 12.04上運行,但是其他發行版也可以將某些庫放在不同的位置。

我的.pro文件中的代碼段:

QT += core \
      gui \
      opengl
QMAKE_CXXFLAGS += -fpermissive
QMAKE_LFLAGS += -static-libgcc -static-libstdc++
CONFIG += static
TEMPLATE = app
LIBS += /usr/local/lib/libboost_thread.a \
        /usr/local/lib/libboost_program_options.a \
        /usr/lib/x86_64-linux-gnu/libfontconfig.a \
        /usr/lib/x86_64-linux-gnu/libGLU.a

ldd的輸出:

linux-vdso.so.1 =>  (0x00007fff992b4000)
libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007f195ccbc000)
libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007f195caa2000)
**libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f195c86b000)**
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f195c5cf000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f195c3be000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f195c089000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f195be85000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f195bc7d000)
**libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f195ba1c000)**
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f195b7ff000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f195b505000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f195b147000)
/lib64/ld-linux-x86-64.so.2 (0x00007f195ced9000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f195af42000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f195ad18000)
**libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f195ab00000)**
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f195a8e2000)
libglapi.so.0 => /usr/lib/x86_64-linux-gnu/libglapi.so.0 (0x00007f195a6bd000)
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f195a4b9000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f195a2b3000)
libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007f195a0b1000)
libxcb-glx.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-glx.so.0 (0x00007f1959e99000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f1959c94000)
libdrm.so.2 => /usr/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007f1959a89000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f1959885000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f195967f000)

更新:

此后,我放棄了這項任務,因為它似乎並不可行。 由於開發人員已經決定可以發布源代碼,因此我將使用標准的./configure、make和make install進行移植。

即使我能夠靜態鏈接這些庫,libc的版本也不同於Ubuntu11。據我所知,libc不能靜態鏈接。 看來最好的選擇是使用GNU的自動工具構建一個程序包,但是即使那樣也很痛苦。

關於如何使用GNU工具為Qt項目創建./configure腳本的任何提示或技巧?

構建一個可移植的完全靜態的可執行文件並不容易。 據我了解,為什么這樣做實際上並不可行,存在很多技術問題。 libc不能靜態鏈接,因此出於兼容性方面的考慮,必須使用舊版本的libc進行編譯。

在Linux平台上實現可移植性的最佳解決方案是發布源代碼並使用GNU的Autotools構建./configure腳本。 但是,使用Qt項目很難完成該任務。

最終,我訴諸於使用基本安裝腳本發布源代碼,該腳本將檢查計算機上是否安裝了Qt並使用qmake來構建項目。 這不是一個很好的解決方案,但可以。

如果您不願意發布源代碼,請構建一個半靜態(使用Qt以及可能還有其他一些庫)鏈接的可執行文件,並安裝一個安裝程序以驗證庫是否位於正確的位置,並在必要時進行安裝。

如果我能猜到..

不久前,我在一些基於Linux的操作系統中成為一個靜態鏈接的應用程序,我不得不包含所有靜態庫,我也想使用3party。 但是對於Qt模塊來說,這是一個不清楚的行為..例如,對於我來說:我想要的qico模塊將僅靜態包含在以下結構中:

在.pro文件中:

QTPLUGIN += qico
DEFINES += STATIC

在main.cpp中:

#ifdef STATIC
#include <QtPlugin>
Q_IMPORT_PLUGIN(qico)
#endif

可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM