使用静态 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 中的类型不匹配 dialogs/qcolordialog.cpp:179:7:注意:匿名命名空间中定义的类型"struct QWellArray"不能与类型"struct QWellArray"匹配
dialogs/qcolordialog.cpp:180:1:注意:在另一个翻译单元的匿名命名空间中定义的不兼容类型 qicohandler.cpp:95:3:警告:"结构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应用程序也是如此)。
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 使用调试/崩溃报告将应用程序部署到客户端
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 控制台输出在 Qt5 中未正确显示
- 在Qt5中使用QTextSteam时的"使用已删除功能"
- Qt5 从 MySQL 数据库中选择数据
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- Qt5 用户界面编译器:-i 选项不可用
- Qt QML相机在部署后显示白屏
- Qt5 部署"procedure entry point could not be located"
- 使用静态 Qt 构建在 Linux 上部署 Qt5 应用程序
- 在将 cmake 项目与 Qt5 链接时部署 icu 库
- Linux上的静态Qt5构建:部署时如何处理字体
- Qt5项目部署-QProxy样式使用
- MinGW和Qt5.6的应用程序部署
- Qt5部署了QtWebEngine项目,无法播放HTML5视频
- 部署c++ QT5应用程序
- Qt5部署的应用程序在QMovie中不显示GIF图像