簡體   English   中英

使用靜態Qt構建在Linux上部署Qt5應用程序

[英]Deploying Qt5 application on Linux using static Qt build

我已經使用以下命令在ubuntu上構建並安裝了Qt5.11的靜態版本:

make distclean; ./configure 
-static -release -ltcg -optimize-size -no-pch -prefix 
"/opt/qt/511-static-release" -skip webengine -nomake tools 
-nomake tests -nomake examples; make -j 8; make install;

構建成功完成。

然后,我嘗試將我的項目與此版本鏈接,但失敗。 這是輸出的最后幾行:

編譯輸出(Qt-Creator)

...

../src/config/config_dialog.h -o moc_config_dialog.cpp
g++ -c -pipe -std=c++11 -g -std=gnu++11 -Wall -W -D_REENTRANT -fPIC - 
DQT_DEPRECATED_WARNINGS -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB 
-DQT_CORE_LIB -I../../my-gui-qt -I. -I../src/view/ -I./model - 
I/opt/qt/511-static-release/include -I/opt/qt/511-static- 
release/include/QtWidgets -I/opt/qt/511-static-release/include/QtGui - 
I/opt/qt/511-static-release/include/QtNetwork -I/opt/qt/511-static- 
release/include/QtCore -I. -isystem /usr/include/libdrm -I. - 
I/opt/qt/511-static-release/mkspecs/linux-g++ -o moc_config_dialog.o 
moc_config_dialog.cpp

鏈接器輸出

 g++ -Wl,-Bdynamic -lGL -static -fPIC -o my-gui-qt main.o 
 mainwindow.o task_status_delegate.o my-gui-qt_plugin_import.o  
 qrc_resources.o moc_mainwindow.o moc_task_table_view.o 
 moc_task_table_model.o moc_config_dialog.o 
 -L/opt/qt/511-static-release/lib -lQt5OpenGL -L/usr/lib/x86_64-linux-
 gnu -L/opt/qt/511-static-release/plugins/platforms 
 -lqxcb -L/opt/qt/511-static--release/plugins/xcbglintegrations 
 -lqxcb-glx-integration -lQt5XcbQpa -lQt5ServiceSupport 
 -lQt5ThemeSupport -lQt5EventDispatcherSupport 
 -lQt5FontDatabaseSupport -lfontconfig -lfreetype -lQt5GlxSupport - 
 lXext -lQt5EdidSupport -lxcb-glx -lX11-xcb -lX11 -lXi -lSM -lICE - 
 lXrender -lxcb-static -lxcb -L/opt/qt/511-static- 
 release/plugins/imageformats -lqgif -lqicns -lqico -lqjpeg -lqtga - 
 lqtiff -lqwbmp -lqwebp -L/opt/qt/511-static-release/plugins/bearer - 
 lqconnmanbearer -lqgenericbearer -lqnmbearer -lQt5DBus -lQt5Widgets - 
 lQt5Gui -lpng12 -lqtharfbuzz -lQt5Network -lQt5Core -lm -lz -licui18n 
 -licuuc -licudata -lqtpcre2 -ldl -lgthread-2.0 -lglib-2.0 -lGL - 
 lpthread 

鏈接器警告

../../include/QtCore/../../src/corelib/kernel/qobjectdefs_impl.h:163:46:警告:類型'struct Function'違反了一個定義規則[-Wodr] .moc / qcolordialog。 moc:111:57:注意:另一個翻譯單元中定義了其他類型

dialogs / qcolordialog.cpp:1738:41:注意:相應定義的第一個區別是字段'__pfn'

.moc / qcolordialog.moc:111:56:注意:在另一個翻譯單元lto1中定義了一個名稱相同但類型不同的字段:注意:參數1對話框中的類型不匹配/qcolordialog.cpp:179:7:注意:輸入'匿名命名空間中定義的struct QWellArray'與類型'struct QWellArray'不匹配

dialogs / qcolordialog.cpp:180:1:注意:在另一個翻譯單元qicohandler.cpp:95:3中的匿名名稱空間中定義的不兼容類型:警告:類型'struct BMP_INFOHDR'違反了一個定義規則[-Wodr]

...以及其他一些類似的警告。

鏈接確實完成並生成可執行文件,但它不可運行。 我可以看到文件在那里:

$ file my-gui-qt

$ my-gui-qt: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), 
dynamically linked, interpreter /lib/ld64.so.1, for GNU/Linux 2.6.32, 
BuildID[sha1]=0e22025dfc5f4bf4dbba598a6f692607303b68c, not stripped

但是嘗試運行它會出現錯誤:

me@me-Inspiron-15-7000-Gaming:~/code/my-gui-qt/build-static$ ./my-gui- 
qt 
bash: ./my-gui-qt: No such file or directory

編輯:我能夠使用相同的Qt 5.11靜態構建和使用相同庫的瑣碎(小巧)Qt應用程序重現此問題。 該應用程序將編譯並正常運行,直到添加與上述my-gui-qt應用程序相同的QMAKE標志:

QMAKE_LFLAGS += -Wl,-Bdynamic -lGL -static

原因是將不同的解釋器鏈接到exe:

所以沒有上面的QMAKE_LFLAGS

$file TestProject*

得到:

TestProject: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), 
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for 
GNU/Linux 2.6.32, 
BuildID[sha1]=993c09e6977c18772569a5a6ecb452c03a884f2d, not stripped

並運行良好。 但是帶有標志它給出:

TestProject: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), 
dynamically linked, interpreter /lib/ld64.so.1, for GNU/Linux 2.6.32, 
BuildID[sha1]=29674cc4997c91b45f9c87bc53ee858b12639e3b, not stripped

並且不運行(bash ::無此類文件或目錄)。 似乎設置-Bdynamic標志將使gcc回退到Ubuntu16.04中不存在的通用Unix gcc解釋器/lib/lib64.so.1。 不確定如何解決此問題? 嘗試-Wl,-dynamic-linker = / lib / ld-lsb.so.2沒有成功..

因此事實證明,這個問題是以前已經解決的,我只是看不到它。

當將Qt應用程序鏈接到靜態版本的Qt時,但某些組件(libGL.so)可以動態鏈接(即QMAKE_LFLAGS + = -Wl,-Bdynamic,--lGL -static),則ELF解釋器可以解析為其默認值(由於上面的命令將覆蓋特定的解釋器路徑),因此要恢復該路徑,您應再次指定它(如許多其他人所說的那樣),如下所示:

QMAKE_LFLAGS += -Wl,-dynamic-linker=/lib64/ld-linux-x86-64.so.2  

應用程序現在可以正常運行。 當使用這些標志的組合時,仍然會保留多個定義警告(即使對於瑣碎的Qt應用程序)。

暫無
暫無

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

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