ARM 工具链在错误的库目录中查找
ARM toolchain looks in the wrong directory for libraries
对于我的项目,我需要为通用 ARM 设备编译 Qt 5.9.1。我已经设置了 linaro 的工具链。但是 Qt 配置在此停止:
/usr/bin/arm-linux-gnueabihf-g++ -mfloat-abi=hard --sysroot=/mnt/elvees-rootfs/ -Wl,-O1 -fuse-ld=gold -o verifyspec verifyspec.o
/usr/bin/arm-linux-gnueabihf-ld.gold: error: /lib/libc.so.6: incompatible target
/usr/bin/arm-linux-gnueabihf-ld.gold: error: cannot open /lib/ld-linux-armhf.so.3: No such file or directory
/usr/bin/arm-linux-gnueabihf-ld.gold: error: /lib/libc_nonshared.a(elf-init.oS): incompatible target
../sysdeps/arm/start.S:124: error: undefined reference to '__libc_start_main'
../sysdeps/arm/start.S:128: error: undefined reference to 'abort'
../sysdeps/arm/start.S:113: error: undefined reference to '__libc_csu_fini'
../sysdeps/arm/start.S:120: error: undefined reference to '__libc_csu_init'
collect2: error: ld returned 1 exit status
从外观上看,arm-linux-gnueabihf-g++ 在主机的 /lib/ 目录中查找库,而不是在 sysroot 中。这种行为的任何原因以及如何解决?我最好的选择是挂载的 sysroot 中损坏的符号链接,但我手动更改了 "libc.so.6" 一个,输出仍然相同。
澄清一下,主机和目标是 运行 Arch.
编辑
应要求,这是我的 qmake.conf(生成 mkspec):
include(../common/linux_device_pre.conf)
ELVEES_CFLAGS = -march=armv7-a -mtune=cortex-a9 -mfpu=neon-fp16 -DLINUX=1
QMAKE_CFLAGS += $$ELVEES_CFLAGS
QMAKE_CXXFLAGS += $$ELVEES_CFLAGS
DISTRO_OPTS += hard-float
QT_QPA_DEFAULT_PLATFORM = eglfs
include(../common/linux_arm_device_post.conf)
QMAKE_INCDIR_EGL = /mnt/elvees-rootfs/usr/include/EGL
QMAKE_LIBDIR_EGL = /mnt/elvees-rootfs/usr/lib
QMAKE_INCDIR_OPENGL_ES2 = /mnt/elvees-rootfs/include/GLES2
QMAKE_LIBDIR_OPENGL_ES2 = /mnt/elvees-rootfs/usr/lib
QMAKE_LIBS_EGL = -lEGL
QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 $${QMAKE_LIBS_EGL}
load(qt_config)
这些是 qt_config 选项:
./configure \
-opengl es2 \
-device arch-elvees-g++ \
-device-option CROSS_COMPILE=/usr/bin/arm-linux-gnueabihf- \
-sysroot /mnt/elvees-rootfs/ \
-opensource \
-confirm-license \
-optimized-qmake \
-release \
-make libs \
-prefix /opt/qt-elvees\
-no-pch \
-nomake examples \
-nomake tests \
-no-xcb \
-eglfs \
-v
显然,添加 -no-gcc-sysroot
参数来配置有效。
对于我的项目,我需要为通用 ARM 设备编译 Qt 5.9.1。我已经设置了 linaro 的工具链。但是 Qt 配置在此停止:
/usr/bin/arm-linux-gnueabihf-g++ -mfloat-abi=hard --sysroot=/mnt/elvees-rootfs/ -Wl,-O1 -fuse-ld=gold -o verifyspec verifyspec.o
/usr/bin/arm-linux-gnueabihf-ld.gold: error: /lib/libc.so.6: incompatible target /usr/bin/arm-linux-gnueabihf-ld.gold: error: cannot open /lib/ld-linux-armhf.so.3: No such file or directory /usr/bin/arm-linux-gnueabihf-ld.gold: error: /lib/libc_nonshared.a(elf-init.oS): incompatible target ../sysdeps/arm/start.S:124: error: undefined reference to '__libc_start_main' ../sysdeps/arm/start.S:128: error: undefined reference to 'abort' ../sysdeps/arm/start.S:113: error: undefined reference to '__libc_csu_fini' ../sysdeps/arm/start.S:120: error: undefined reference to '__libc_csu_init' collect2: error: ld returned 1 exit status
从外观上看,arm-linux-gnueabihf-g++ 在主机的 /lib/ 目录中查找库,而不是在 sysroot 中。这种行为的任何原因以及如何解决?我最好的选择是挂载的 sysroot 中损坏的符号链接,但我手动更改了 "libc.so.6" 一个,输出仍然相同。 澄清一下,主机和目标是 运行 Arch.
编辑
应要求,这是我的 qmake.conf(生成 mkspec):
include(../common/linux_device_pre.conf)
ELVEES_CFLAGS = -march=armv7-a -mtune=cortex-a9 -mfpu=neon-fp16 -DLINUX=1
QMAKE_CFLAGS += $$ELVEES_CFLAGS
QMAKE_CXXFLAGS += $$ELVEES_CFLAGS
DISTRO_OPTS += hard-float
QT_QPA_DEFAULT_PLATFORM = eglfs
include(../common/linux_arm_device_post.conf)
QMAKE_INCDIR_EGL = /mnt/elvees-rootfs/usr/include/EGL
QMAKE_LIBDIR_EGL = /mnt/elvees-rootfs/usr/lib
QMAKE_INCDIR_OPENGL_ES2 = /mnt/elvees-rootfs/include/GLES2
QMAKE_LIBDIR_OPENGL_ES2 = /mnt/elvees-rootfs/usr/lib
QMAKE_LIBS_EGL = -lEGL
QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 $${QMAKE_LIBS_EGL}
load(qt_config)
这些是 qt_config 选项:
./configure \
-opengl es2 \
-device arch-elvees-g++ \
-device-option CROSS_COMPILE=/usr/bin/arm-linux-gnueabihf- \
-sysroot /mnt/elvees-rootfs/ \
-opensource \
-confirm-license \
-optimized-qmake \
-release \
-make libs \
-prefix /opt/qt-elvees\
-no-pch \
-nomake examples \
-nomake tests \
-no-xcb \
-eglfs \
-v
显然,添加 -no-gcc-sysroot
参数来配置有效。