无法从amd64_focal构建环境交叉构建armhf_focal Qt应用程序

时间:2020-10-30 05:15:36

标签: qt qmake

我需要在amd64_focal环境中交叉构建将QT用于armhf_focal的应用程序。
我有一个文件/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-arm-gnueabihf-g++/qmake.conf,它定义了armhf设置。它会创建一个Makefile。
运行构建时,.obj文件可以正常构建,但由于路径错误而导致链接器失败

问题在于Makefile中变量LIBS的定义,该变量具有显式路径 / usr / lib / x86_64-linux-gnu /
LIBS = ... /usr/lib/x86_64-linux-gnu/libQt5Concurrent.so ...

但是我需要从交叉构建rootfs-focal-armhf目录(即/toolchains/rootfs-focal-armhf/lib)链接文件
如果我手动删除显式路径(即LIBS = ... -lQt5Concurrent ...),那很好(因为目录/toolchains/rootfs-focal-armhf/lib在搜索路径中,并且文件由链接器拾取)
< / p>

显式路径的原因来自文件/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt.prf 它会自动找到指定qt库的路径(例如libQt5Concurrent.so)(请参见snippet1)
通过从mkspec文件load(qt_config)的最后一行(/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-arm-gnueabihf-g++/qmake.conf)调用的文件qt_config加载文件qt.prf(请参见snippet2)

我试图指出armhf配置,例如通过从rootfs-focal-armhf环境(即来自
)加载文件qt_config.prf /toolchains/rootfs-focal-armhf/lib/qt5/mkspecs/features/qt_config.prf 但这会导致其他错误。

amd64_focal的Qt和qmake版本:

qmake --version
QMake version 3.1
Using Qt version 5.12.8 in /usr/lib/x86_64-linux-gnu

如何从主机环境(x86_64-linux-gnu)加载与focus-armhf相关的qt_config?

p.s。 我注意到从amd64_ bionic 交叉构建到例如arm64_ bionic 。 这是因为文件features / qt.prf是不同的(与amd64_focal中的同一文件相比),并且不尝试将显式路径附加到lib(请参见snippet3)。

qmake --version
QMake version 3.1
Using Qt version 5.9.5 in /usr/lib/x86_64-linux-gnu

谢谢


snippet1-qt.prf中的代码将绝对路径附加到库中

cat /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt.prf ... for(ever) {
    # Topological resolution of modules based on their QT.<module>.depends variable
    FULL_QT$$var_sfx = $$resolve_depends(CLEAN_QT$$var_sfx, "QT.")
    # Finally actually add the modules
    unset(BAD_QT)
    for(QTLIB, FULL_QT$$var_sfx) {
        MODULE_NAME = $$eval(QT.$${QTLIB}.name)
        MODULE_MODULE = $$eval(QT.$${QTLIB}.module)
        MODULE_INCLUDES = $$eval(QT.$${QTLIB}.includes)
        MODULE_LIBS = $$eval(QT.$${QTLIB}.libs) ...

snippet2-armhf的mkspecs文件加载了qt_config,该文件加载了错误的本地(x86_64)环境

cat /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-arm-gnueabihf-g++/qmake.conf 

# qmake configuration for building with arm-linux-gnueabihf-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

QMAKE_LIBS_OPENGL       = -lGL
QMAKE_LIBDIR_OPENGL     = /usr/X11R6/lib64

# modifications to g++.conf
QMAKE_CC                = arm-linux-gnueabihf-gcc
QMAKE_CXX               = arm-linux-gnueabihf-g++
QMAKE_LINK              = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy
QMAKE_NM                = arm-linux-gnueabihf-nm -P
QMAKE_STRIP             = arm-linux-gnueabihf-strip

load(qt_config)

snippet3-仿生与焦点的qt.prf之间的差异-焦点中的代码将绝对路径追加到库中

diff arm64_bionic/sdk-s1/qt.prf.arm64_bionic armhf_focal/sdk-s1/qt.prf.arm64_focal         

bionic - the library (e.g. libQt5Concurrent.so) is created with "-lQt5Concurrent"
                lib = $$MODULE_MODULE$$qtPlatformTargetSuffix()
                LIBS$$var_sfx += -l$$lib

focal - the library (e.g. libQt5Concurrent.so) is created with "/usr/lib/x86_64-linux-gnu/libQt5Concurrent.so"
...
                lib = $$MODULE_LIBS/$$QMAKE_PREFIX_SHLIB$${lib}.$$QMAKE_EXTENSION_SHLIB

0 个答案:

没有答案