我需要在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