对不起我的英语不好。
我想要构建没有任何共享库(qt库和glibc及所有库)依赖的QT应用程序。为此,我下载了QT源,使用-static选项进行构建,并通过ldd检查所有* .a库。该库没有来自共享.so lib的依赖项。我将新的QT库安装到/opt/Q5.8,并将/opt/Q5.8/bin添加到$ PATH。
然后创建测试Hello world项目。
主.cpp:

#include <iostream>


using namespace std;

int main(int argc, char *argv[])
{
   cout << "Hello world!" << endl;
   return 0;
}

main.pro:
CONFIG += debug console
SOURCES += main.cpp
QMAKE_LFLAGS += -static

然后我运行qmake |使。
qmake成功创建Makefile,但输出错误:
[oleg@reffum qt_static]$ make
g++ -static -o main main.o main_plugin_import.o   -L/opt/Qt5.8/lib -L/opt/Qt5.8/plugins/platforms -lqwayland-egl -lwayland-egl -lqwayland-generic -lqwayland-xcomposite-egl -lqwayland-xcomposite-glx -lQt5WaylandClient -lXcomposite -lwayland-client -lwayland-cursor -lqxcb -L/opt/Qt5.8/plugins/xcbglintegrations -lqxcb-egl-integration -lqxcb-glx-integration -lQt5XcbQpa -lxcb-xinerama -lQt5LinuxAccessibilitySupport -lQt5AccessibilitySupport -lQt5GlxSupport -lXrender -lxcb-xkb -lxcb-sync -lxcb-xfixes -lxcb-randr -lxcb-image -lxcb-shm -lxcb-keysyms -lxcb-icccm -lxcb-shape -lxcb-glx -lXi -lSM -lICE -lxcb-render-util -lxcb-render -lxkbcommon-x11 -L/opt/Qt5.8/plugins/imageformats -lqgif -lqicns -lqico -lqjp2 -ljasper -lqjpeg -ljpeg -lqmng -lmng -lqtga -lqtiff -ltiff -lqwbmp -lqwebp -lwebp -lwebpdemux -L/opt/Qt5.8/plugins/egldeviceintegrations -lqeglfs-kms-egldevice-integration -lqeglfs-kms-integration -lQt5EglFsKmsSupport -lgbm -ldrm -lqeglfs-x11-integration -lQt5EglFSDeviceIntegration -lQt5EventDispatcherSupport -lQt5ServiceSupport -lQt5ThemeSupport -lQt5DBus -ldbus-1 -lQt5FontDatabaseSupport -lQt5FbSupport -lQt5EglSupport -lXext -lQt5PlatformCompositorSupport -lQt5InputSupport -lmtdev -linput -lxkbcommon -lQt5Gui -lpng16 -lharfbuzz -lQt5DeviceDiscoverySupport -ludev -lQt5Core -licui18n -licuuc -licudata -lm -ldl -lrt -lz -lpcre16 -lgthread-2.0 -lglib-2.0 -lxcb -lX11 -lX11-xcb -lfontconfig -lfreetype -lts -lEGL -lGL -lpthread
/usr/bin/ld: cannot find -lwayland-egl
/usr/bin/ld: cannot find -lXcomposite
/usr/bin/ld: cannot find -lwayland-client
/usr/bin/ld: cannot find -lwayland-cursor
/usr/bin/ld: cannot find -lxcb-xinerama
/usr/bin/ld: cannot find -lXrender
/usr/bin/ld: cannot find -lxcb-xkb
/usr/bin/ld: cannot find -lxcb-sync
/usr/bin/ld: cannot find -lxcb-xfixes
/usr/bin/ld: cannot find -lxcb-randr
/usr/bin/ld: cannot find -lxcb-image
/usr/bin/ld: cannot find -lxcb-shm
/usr/bin/ld: cannot find -lxcb-keysyms
/usr/bin/ld: cannot find -lxcb-icccm
/usr/bin/ld: cannot find -lxcb-shape
/usr/bin/ld: cannot find -lxcb-glx
/usr/bin/ld: cannot find -lXi
/usr/bin/ld: cannot find -lSM
/usr/bin/ld: cannot find -lICE
/usr/bin/ld: cannot find -lxcb-render-util
/usr/bin/ld: cannot find -lxcb-render
/usr/bin/ld: cannot find -lxkbcommon-x11
/usr/bin/ld: cannot find -ljpeg
/usr/bin/ld: cannot find -lmng
/usr/bin/ld: cannot find -ltiff
/usr/bin/ld: cannot find -lwebp
/usr/bin/ld: cannot find -lwebpdemux
/usr/bin/ld: cannot find -lgbm
/usr/bin/ld: cannot find -ldrm
/usr/bin/ld: cannot find -ldbus-1
/usr/bin/ld: cannot find -lXext
/usr/bin/ld: cannot find -lmtdev
/usr/bin/ld: cannot find -linput
/usr/bin/ld: cannot find -lxkbcommon
/usr/bin/ld: cannot find -lpng16
/usr/bin/ld: cannot find -lharfbuzz
/usr/bin/ld: cannot find -ludev
/usr/bin/ld: cannot find -licui18n
/usr/bin/ld: cannot find -licuuc
/usr/bin/ld: cannot find -licudata
/opt/Qt5.8/lib/libQt5Core.a(qlibrary_unix.o): In function `QLibraryPrivate::load_sys()':
qlibrary_unix.cpp:(.text+0x103a): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/bin/ld: cannot find -lpcre16
/usr/bin/ld: cannot find -lgthread-2.0
/usr/bin/ld: cannot find -lglib-2.0
/usr/bin/ld: cannot find -lxcb
/usr/bin/ld: cannot find -lX11
/usr/bin/ld: cannot find -lX11-xcb
/usr/bin/ld: cannot find -lfontconfig
/usr/bin/ld: cannot find -lfreetype
/usr/bin/ld: cannot find -lts
/usr/bin/ld: cannot find -lEGL
/usr/bin/ld: cannot find -lGL
collect2: error: ld returned 1 exit status
make: *** [Makefile:312: main] Error 1

我究竟做错了什么?

最佳答案

您必须从源代码下载并编译Qt,并传递静态标志以获取它,才能构建自己的静态二进制文件。

执行此操作时,您将在目标计算机上拥有不需要qt库的二进制文件,但是对于基本QtCore和QtGui,您的二进制文件将为13 + MB,并且内置的库将更多...与0.5 + MB相比对于动态链接的Qt可执行文件而言,这种情况更为典型。

http://doc.qt.io/qt-5/configure-options.html

http://www.linuxfromscratch.org/blfs/view/8.0/x/qt5.html

使用这样的下载文件...

http://download.qt.io/archive/qt/5.8/5.8.0/single/qt-everywhere-opensource-src-5.8.0.tar.xz

解压缩它,然后执行适当的configure and make命令。

./configure -prefix         $QT5PREFIX \
            -sysconfdir     /etc/xdg   \
            -confirm-license           \
            -opensource                \
            -static  #added this line  \
            -dbus-linked               \
            -openssl-linked            \
            -system-harfbuzz           \
            -system-sqlite             \
            -nomake examples           \
            -no-rpath                  \
            -skip qtwebengine          &&
make

完成之后,您可以整天构建静态Qt程序。

希望能有所帮助。

09-10 00:59
查看更多