You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux主机下Qt5源码交叉编译ARM时默认编译器误用问题排查

交叉编译Qt5时make使用主机g++而非指定交叉编译器的问题

问题描述

我正尝试在Linux主机上从Git源码构建适用于ARM平台的Qt5,配置参数如下:

../qt5/configure -sysroot /home/r/variscite2/yocto_varsomam43_daisy/tisdk/build/arago-tmp-external-linaro-toolchain/sysroots/varsomam43 -device linux-oe-g++ -no-xkb -no-xkbcommon -no-xkbcommon-evdev -no-sqlite -opensource -release -shared -skip qtwebengine -skip wayland -nomake tests -nomake examples -confirm-license -device-option CROSS_COMPILE=/opt/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/bin/arm-linux-gnueabihf- -prefix /usr/local/qt5-git -no-opengl

设备配置文件内容如下:

include(../common/linux_device_pre.conf) # I consider it a bug that this is required, but our EGL config.test _requires_ it QMAKE_LFLAGS += -Wl,-rpath-link,$$[QT_SYSROOT] # The official opt vc EGL references GLESv2 symbols: need to link it QMAKE_CFLAGS = -march=armv7 -mtune=cortex-a9 -mfpu=neon QMAKE_CXXFLAGS = $$QMAKE_CFLAGS DISTRO_OPTS += hard-float DISTRO_OPTS += deb-multi-arch CROSS_COMPILE=/opt/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/bin/arm-linux-gnueabihf- ROOTFS =/home/r/variscite2/yocto_varsomam43_daisy/tisdk/build/arago-tmp-external-linaro-toolchain/sysroots/varsomam43 QMAKE_CC = $${CROSS_COMPILE}gcc QMAKE_CXX = $${CROSS_COMPILE}g++ QMAKE_LINK = $${CROSS_COMPILE}g++ QMAKE_LINK_SHLIB = $${CROSS_COMPILE}g++ QMAKE_LINK_C = $${CROSS_COMPILE}gcc QMAKE_AR = $${CROSS_COMPILE}ar cr QMAKE_OBJCOPY = $${CROSS_COMPILE}objcopy QMAKE_STRIP = $${CROSS_COMPILE}strip QMAKE_LFLAGS_RELEASE = -Wl,-O1,-rpath=$${ROOTFS}/usr/lib QMAKE_LFLAGS_RELEASE += --sysroot=/home/r/variscite2/yocto_varsomam43_daisy/tisdk/build/arago-tmp-external-linaro-toolchain/sysroots/varsomam43 QMAKE_INCDIR = $${ROOTFS}/usr/include QMAKE_LIBDIR += $${ROOTFS}/usr/lib QMAKE_INCDIR_X11 = $${ROOTFS}/usr/include QMAKE_LIBDIR_X11 = $${ROOTFS}/usr/lib QMAKE_INCDIR_OPENGL = $${ROOTFS}/usr/include QMAKE_LIBDIR_OPENGL = $${ROOTFS}/usr/lib include(../common/linux_arm_device_post.conf) load(qt_config)

配置过程已成功完成,但执行make命令时,编译却使用默认主机g++而非指定的交叉编译器,请问我哪里操作有误?

可能的原因及解决方法

遇到这种交叉编译Qt时编译器跑偏的问题,大概率是环境变量、配置冲突或者缓存残留导致的,给你几个排查方向:

  • 环境变量抢占了优先级:很多时候主机系统会提前设置CC、CXX环境变量,Qt的configure会优先选用这些变量指定的编译器,而忽略你在设备配置或命令行里的设置。你可以先在终端里执行:

    echo $CC
    echo $CXX
    

    如果输出是主机的gcc/g++路径,那就在执行make前先清空这些变量:

    unset CC CXX
    make
    
  • 重复配置的冲突问题:你既在设备配置文件里写死了CROSS_COMPILE路径,又在configure命令里用-device-option传递了一遍,这可能导致配置逻辑混乱。建议只保留一个配置来源:要么去掉configure命令里的-device-option CROSS_COMPILE=...,完全依赖设备配置文件的设置;要么确保设备配置里的CROSS_COMPILE和你命令行传递的路径完全一致,避免路径错误导致找不到交叉编译器,最后 fallback 到主机编译器。

  • 检查configure生成的Makefile:进入某个子模块目录(比如qtbase),打开生成的Makefile,搜索CXX或CC关键字,看看对应的路径是不是你指定的交叉编译器。如果不是,说明configure过程没正确读取到你的配置,这时候可以重新运行configure并加上-v参数查看详细日志,定位哪里出了问题:

    ../qt5/configure -v [你的其他所有参数]
    
  • sysroot路径权限问题:确保你的用户对sysroot目录有足够的读取权限,如果权限不足,Qt在配置时可能无法正确检测交叉编译环境,转而使用主机编译器。可以用ls -ld /home/r/variscite2/yocto_varsomam43_daisy/tisdk/build/arago-tmp-external-linaro-toolchain/sysroots/varsomam43检查权限,必要时用sudo chmod -R a+rX调整。

  • 清理旧构建文件重新来:如果之前尝试过编译,残留的Makefile或缓存文件可能会干扰新的配置。建议完全清空构建目录,重新创建后再执行configure和make:

    rm -rf 你的构建目录名
    mkdir 你的构建目录名
    cd 你的构建目录名
    # 重新运行你的configure命令
    ../qt5/configure [你的所有参数]
    make
    

内容的提问来源于stack exchange,提问作者ephemerr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:22:18