在之前的文章中学会了如何制作 GCC 交叉编译器,有了交叉编译器后,就可以用交叉编译器来编译第三方库,比如 Qt。 本次的最终任务是制作 Windows 上使用的 Qt linux x86_64 库。
为什么不完美
可能是因为 Qt 5.7.1 版本太老的原因,最初尝试在 msys2 环境下制作,但是无法生成配置程序,大概是因为这个版本的 qmake 总是认为自身运行 Windows 原生环境下,导致一些代码逻辑在 msys2 下失败了,不知道新版本 Qt 情况如何。 正因为这样我们就只能在 Windows 下编译,但在 Windows 下又无法用configure来配置,只能用configure.bat,但用configure.bat时就不会有 Linux 下的一些编译选项和检测,这样就无法编译制作一些 Linux Qt 依赖的插件库。 所以只能编译 Qt 的基础库,比如Qt5Core、Qt5Gui等等,当最终编译出的项目要部署时就会缺少一些插件库,这就是我说的“不完美”。
如何解决呢? 一个曲线救国的方法,在目标 Linux 系统上用相同的编译器,Qt版本、编译参数编译一份 Qt 库,这样我们在部署自己的项目时就不用 Windows 的 Qt 库了,只用拷贝自己的项目文件到目标 Linux 系统上即可,实际运行时 Qt 库用的是 Linux 下编译的那套。 这就要求两边的编译器、Qt版本、编译参数完全一致,否则可能因为 ABI 问题引起崩溃之类的问题。
C:\>mingw32-make -v GNU Make 4.4.1 Built for x86_64-w64-mingw32 Copyright (C) 1988-2023 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: warning: libpthread.so.0, needed by C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Widgets.so.5.7.1, not found (try using -rpath or -rpath-link) C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: warning: libGL.so.1, needed by C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Widgets.so.5.7.1, not found (try using -rpath or -rpath-link) C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: warning: libdl.so.2, needed by C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1, not found (try using -rpath or -rpath-link) C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Gui.so.5.7.1: undefined reference to `glLoadIdentity' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `pthread_attr_setstacksize@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `pthread_setspecific@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `pthread_cancel@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `dlclose@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `pthread_create@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `pthread_key_create@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `pthread_key_delete@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `dlerror@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `dlopen@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Gui.so.5.7.1: undefined reference to `glMatrixMode' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `pthread_testcancel@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Gui.so.5.7.1: undefined reference to `glOrtho' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `pthread_condattr_setclock@GLIBC_2.3.3' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `dlsym@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Core.so.5.7.1: undefined reference to `pthread_once@GLIBC_2.2.5' C:/cross-toolchain/Linux-x86_64/bin/../lib/gcc/x86_64-linux-gnu/15.1.0/../../../../x86_64-linux-gnu/bin/ld.exe: C:/qt5.7.1-x86_64-linux-gnu/lib/libQt5Gui.so.5.7.1: undefined reference to `glLoadMatrixf'