问题遇到的现象和发生背景
在ubuntu20.04上使用Loongarch64交叉编译Qt15.3版本编译失败 。
loongarch64交叉编译器是在http://www.loongnix.cn/zh/toolchain/GNU/ 这里下载的。
我操作流程大致如下:
- 1.交叉编译环境搭建
交叉编译器版本信息确认:
loongarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=loongarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/home/bsh/Documents/toolchain-loongarch64-linux-gnu-cross-830/bin/../libexec/gcc/loongarch64-linux-gnu/8.3.0/lto-wrapper
Target: loongarch64-linux-gnu
Configured with: /dev/shm/build_loongarch64_cross-830-rc1.0_2022-04-22/src/gcc/configure --build=x86_64-redhat-linux --host=x86_64-redhat-linux --target=loongarch64-linux-gnu --program-prefix=loongarch64-linux-gnu- --prefix=/dev/shm/build_loongarch64_cross-830-rc1.0_2022-04-22/cross --libdir=/dev/shm/build_loongarch64_cross-830-rc1.0_2022-04-22/cross/lib --with-gxx-include-dir=/dev/shm/build_loongarch64_cross-830-rc1.0_2022-04-22/cross/sysroot/include/c++ --with-sysroot=/dev/shm/build_loongarch64_cross-830-rc1.0_2022-04-22/cross/sysroot --with-native-system-header-dir=/include --with-slibdir=/dev/shm/build_loongarch64_cross-830-rc1.0_2022-04-22/cross/sysroot/lib --with-arch=loongarch64 --with-abi=lp64d --with-multilib-list=lp64d,lp64s --with-pkgversion='LoongArch\ GNU\ toolchain\ rc1.0' --disable-linker-build-id --enable-languages=c,c++,fortran --disable-libgcc --disable-libstdc++ --disable-libgfortran --disable-gcov --disable-libcc1 --enable-threads=posix --enable-tls --enable-initfini-array --enable-__cxa_atexit --disable-libatomic --disable-libmudflap --disable-libssp --disable-libvtv --disable-libgomp --disable-libmpx --disable-nls --disable-bootstrap
Thread model: posix
gcc version 8.3.0 (LoongArch GNU toolchain rc1.0)
交叉编译器链接地址确认:
loongarch64-linux-gnu-ld --verbose | grep SEARCH
SEARCH_DIR("=//loongarch64-linux-gnu/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");
- 2.源码解压并配置mkspecs目录下的qmake.conf文件
修改qmake.conf文件:
#
# qmake configuration for building with loongarch64-linux-gnu-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)
# modifications to g++.conf
QMAKE_CC = loongarch64-linux-gnu-gcc
QMAKE_CXX = loongarch64-linux-gnu-g++
QMAKE_LINK = loongarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = loongarch64-linux-gnu-g++
# modifications to linux.conf
QMAKE_AR = loongarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = loongarch64-linux-gnu-objcopy
QMAKE_NM = loongarch64-linux-gnu-nm -P
QMAKE_STRIP = loongarch64-linux-gnu-strip
load(qt_config)
- 3.配置configure参数至编译脚本compile.sh
CC=loongarch64-linux-gnu-gcc CXX=loongarch64-linux-gnu-g++ ./configure -prefix /home/loongarch64_qt5_15_3_commercial/ \
-commercial -release -xplatform loongarch64-linux-gnu -make libs -nomake examples -no-opengl -nomake tests -nomake tools -confirm-license \
-optimized-qmake \
-skip qt3d \
-skip qtactiveqt \
-skip qtandroidextras \
-skip qtcanvas3d \
-skip qtcharts \
-skip qtconnectivity \
-skip qtdatavis3d \
-skip qtdeclarative \
-skip qtdoc \
-skip qtgamepad \
-skip qtgraphicaleffects \
-skip qtlocation \
-skip qtmacextras \
-skip qtmultimedia \
-skip qtnetworkauth \
-skip qtpurchasing \
-skip qtquickcontrols \
-skip qtquickcontrols2 \
-skip qtremoteobjects \
-skip qtscript \
-skip qtscxml \
-skip qtsensors \
-skip qtserialbus \
-skip qtserialport \
-skip qtspeech \
-skip qtsvg \
-skip qttools \
-skip qttranslations \
-skip qtvirtualkeyboard \
-skip qtwebchannel \
-skip qtwebengine \
-skip qtwebglplugin \
-skip qtwebsockets \
-skip qtwebview \
-skip qtwinextras \
-skip qtxmlpatterns \
-recheck-all -v \
-I /home/bsh/Documents/sysroot/include \
-R /home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu \
-L /home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu \
- 4.执行configure脚本
检查xcb模块时,提示如下错误:
Trying source 1 (type inline) of library xcb ...
+ cd /home/qt-everywhere-src-5.15.3_uos_loongarch64/config.tests/xcb && /home/qt-everywhere-src-5.15.3_uos_loongarch64/qtbase/bin/qmake "CONFIG -= qt debug_and_release app_bundle lib_bundle" "CONFIG += shared warn_off console single_arch" 'QMAKE_LIBDIR += /home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu' 'INCLUDEPATH += /home/sysroot/include' -early "CONFIG += cross_compile" 'QMAKE_USE += xcb' 'QMAKE_LIBS_XCB = -lxcb' /home/qt-everywhere-src-5.15.3_uos_loongarch64/config.tests/xcb
+ cd /home/qt-everywhere-src-5.15.3_uos_loongarch64/config.tests/xcb && MAKEFLAGS= /usr/bin/make clean && MAKEFLAGS= /usr/bin/make
> rm -f main.o
> rm -f *~ core *.core
> loongarch64-linux-gnu-g++ -c -pipe -O2 -w -fPIC -I. -I/home/sysroot/include -I/home/qt-everywhere-src-5.15.3_uos_loongarch64/qtbase/mkspecs/loongarch64-linux-gnu -o main.o main.cpp
> loongarch64-linux-gnu-g++ -Wl,-O1 -o xcb main.o -L/home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu -lxcb
> /home/toolchain-loongarch64-linux-gnu-cross-830/bin/../lib/gcc/loongarch64-linux-gnu/8.3.0/../../../../loongarch64-linux-gnu/bin/ld: warning: libXau.so.6, needed by /home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu/libxcb.so, not found (try using -rpath or -rpath-link)
> /home/toolchain-loongarch64-linux-gnu-cross-830/bin/../lib/gcc/loongarch64-linux-gnu/8.3.0/../../../../loongarch64-linux-gnu/bin/ld: warning: libXdmcp.so.6, needed by /home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu/libxcb.so, not found (try using -rpath or -rpath-link)
> /home/toolchain-loongarch64-linux-gnu-cross-830/bin/../lib/gcc/loongarch64-linux-gnu/8.3.0/../../../../loongarch64-linux-gnu/bin/ld: /home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu/libxcb.so: undefined reference to `XauDisposeAuth'
> /home/toolchain-loongarch64-linux-gnu-cross-830/bin/../lib/gcc/loongarch64-linux-gnu/8.3.0/../../../../loongarch64-linux-gnu/bin/ld: /home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu/libxcb.so: undefined reference to `XdmcpWrap'
> /home/toolchain-loongarch64-linux-gnu-cross-830/bin/../lib/gcc/loongarch64-linux-gnu/8.3.0/../../../../loongarch64-linux-gnu/bin/ld: /home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu/libxcb.so: undefined reference to `XauGetBestAuthByAddr'
> collect2: error: ld returned 1 exit status
> make: *** [Makefile:67:xcb] 错误 1
=> source failed verification.
在路径/home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu中包含了xcb相关的依赖库。
/home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu$ ls libxcb*
libxcb.a libxcb-dri2.so.0 libxcb-image.so libxcb-record.so libxcb-shape.a libxcb-util.so.1 libxcb-xkb.so
libxcb-composite.a libxcb-dri2.so.0.0.0 libxcb-image.so.0 libxcb-record.so.0 libxcb-shape.so libxcb-util.so.1.0.0 libxcb-xkb.so.1
libxcb-composite.so libxcb-dri3.a libxcb-image.so.0.0.0 libxcb-record.so.0.0.0 libxcb-shape.so.0 libxcb-xf86dri.a libxcb-xkb.so.1.0.0
libxcb-composite.so.0 libxcb-dri3.so libxcb-imdkit.so libxcb-render.a libxcb-shape.so.0.0.0 libxcb-xf86dri.so libxcb-xrm.a
libxcb-composite.so.0.0.0 libxcb-dri3.so.0 libxcb-imdkit.so.0 libxcb-render.so libxcb-shm.a libxcb-xf86dri.so.0 libxcb-xrm.so
libxcb-cursor.a libxcb-dri3.so.0.0.0 libxcb-imdkit.so.0.1 libxcb-render.so.0 libxcb-shm.so libxcb-xf86dri.so.0.0.0 libxcb-xrm.so.0
libxcb-cursor.so libxcb-ewmh.a libxcb-keysyms.a libxcb-render.so.0.0.0 libxcb-shm.so.0 libxcb-xfixes.a libxcb-xrm.so.0.0.0
libxcb-cursor.so.0 libxcb-ewmh.so libxcb-keysyms.so libxcb-render-util.a libxcb-shm.so.0.0.0 libxcb-xfixes.so libxcb-xtest.a
libxcb-cursor.so.0.0.0 libxcb-ewmh.so.2 libxcb-keysyms.so.1 libxcb-render-util.so libxcb.so libxcb-xfixes.so.0 libxcb-xtest.so
libxcb-damage.a libxcb-ewmh.so.2.0.0 libxcb-keysyms.so.1.0.0 libxcb-render-util.so.0 libxcb.so.1 libxcb-xfixes.so.0.0.0 libxcb-xtest.so.0
libxcb-damage.so libxcb-glx.a libxcb-present.a libxcb-render-util.so.0.0.0 libxcb.so.1.1.0 libxcb-xinerama.a libxcb-xtest.so.0.0.0
libxcb-damage.so.0 libxcb-glx.so libxcb-present.so libxcb-res.a libxcb-sync.a libxcb-xinerama.so libxcb-xv.a
libxcb-damage.so.0.0.0 libxcb-glx.so.0 libxcb-present.so.0 libxcb-res.so libxcb-sync.so libxcb-xinerama.so.0 libxcb-xvmc.a
libxcb-dpms.a libxcb-glx.so.0.0.0 libxcb-present.so.0.0.0 libxcb-res.so.0 libxcb-sync.so.1 libxcb-xinerama.so.0.0.0 libxcb-xvmc.so
libxcb-dpms.so libxcb-icccm.a libxcb-randr.a libxcb-res.so.0.0.0 libxcb-sync.so.1.0.0 libxcb-xinput.a libxcb-xvmc.so.0
libxcb-dpms.so.0 libxcb-icccm.so libxcb-randr.so libxcb-screensaver.a libxcb-util.a libxcb-xinput.so libxcb-xvmc.so.0.0.0
libxcb-dpms.so.0.0.0 libxcb-icccm.so.4 libxcb-randr.so.0 libxcb-screensaver.so libxcb-util.so libxcb-xinput.so.0 libxcb-xv.so
libxcb-dri2.a libxcb-icccm.so.4.0.0 libxcb-randr.so.0.1.0 libxcb-screensaver.so.0 libxcb-util.so.0 libxcb-xinput.so.0.1.0 libxcb-xv.so.0
libxcb-dri2.so libxcb-image.a libxcb-record.a libxcb-screensaver.so.0.0.0 libxcb-util.so.0.0.0 libxcb-xkb.a libxcb-xv.so.0.0.0
操作环境、软件版本等信息
目标机器及系统:UOS1050 Loongarch64
交叉编译主机:ubuntu20.04 AMD64
交叉编译器:loongarch64-linux-gnu-gcc 8.3
尝试过的解决方法
- 1.尝试在configure脚本中增加参数
-Wl,rpath-link=/home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu
- 2.将库/home/sysroot/lib/uosloongarch64lib/lib/loongarch64-linux-gnu创建软连接到/usr/lib、/lib、/loongarch64/目录下
我想要达到的结果
configure脚本check的时候xcb模块能通过检查
其他疑问
- 1.loongarch64-linux-gnu-ld --verbose | grep SEARCH命令的结果是不是不正常?
这个命令与本机的aarch64-linux-gnu-ld命令执行结果不一致:
aarch64-linux-gnu-ld --verbose | grep SEARCH
SEARCH_DIR("=/usr/local/lib/aarch64-linux-gnu"); SEARCH_DIR("=/lib/aarch64-linux-gnu"); SEARCH_DIR("=/usr/lib/aarch64-linux-gnu"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); SEARCH_DIR("=/usr/aarch64-linux-gnu/lib");