Qt交叉编译x86和arm心得

最近一直在Linux上开发qt程序,主要工作是在x86的Ubuntu上开发编译调试程序,确定没有问题后交叉编译到arm的linux系统上运行

1.环境

Qt的交叉编译环境厂家已经提供了,嵌入式的同事帮我安装调试的,具体就是装了厂家给的gcc编译套件。

2.编译so库的qmake的配置

这个主要问题是x86和arm的编译结果是不一样的,先在x86的环境上编写、调试程序。确定没有bug后再交叉编译成arm程序,在arm上运行,减少调试时间。这就需要满足以下几点:

  1. 库的生成路径要根据具体的编译器自动生成
  2. *.head文件也要同步输出至目标路径的include目录下

方案1:(失败)

bash 复制代码
# 设置 DESTDIR 和目标路径
DESTDIR = /path/to/your/install/directory
INCLUDE_PATH = $$DESTDIR/include

# 使用 system() 创建目标目录并复制文件
QMAKE_POST_LINK += mkdir -p $$INCLUDE_PATH && cp mybrandiden.h $$INCLUDE_PATH/mybrandiden.h

这种方案,发现好像不能成功复制头文件,知道原因的请在评论区指教

方案2:

bash 复制代码
message("DESTDIR: $$QT_ARCH")
#通过不同架构确定DESTDIR
linux {
    contains(QT_ARCH,arm64) {
        DESTDIR=$$clean_path($$PWD/arm)
    }
    contains(QT_ARCH,x86_64) {
        DESTDIR=$$clean_path($$PWD/x86)
    }
}

message($$DESTDIR)

INCLUDE_PATH = $$DESTDIR/include
#通过系统指定复制需要输出的头文件
system("mkdir -p $$INCLUDE_PATH")
system("cp classification.h $$INCLUDE_PATH/classification.h")
system("cp classification_global.h $$INCLUDE_PATH/classification_global.h")

这个方案可以正常满足上述需求。

3.如何调用编译好的so库

调用的时候也需要按照不同的编译器确定调用so库的路径,最终还是用了如下方案:

bash 复制代码
linux {
    message("QT_ARCH: $$QT_ARCH")
    # 如果是 x86 架构
    MY_ARCH=x86

    contains(QT_ARCH, x86_64) {
        MY_ARCH=x86
    }

    contains(QT_ARCH, arm64) {
        MY_ARCH=arm
    }

    LIBS += -L$$PWD/./Quantification/$$MY_ARCH -lQuantification
    INCLUDEPATH += $$PWD/./Quantification/$$MY_ARCH
    DEPENDPATH += $$PWD/./Quantification//$$MY_ARCH

    LIBS += -L$$PWD/./Classification/$$MY_ARCH -lClassification
    INCLUDEPATH += $$PWD/./Classification/$$MY_ARCH
    DEPENDPATH += $$PWD/./Classification/$$MY_ARCH

    LIBS += -L$$PWD/./MyBrandIden/$$MY_ARCH -lMyBrandIden
    INCLUDEPATH += $$PWD/./MyBrandIden/$$MY_ARCH
    DEPENDPATH += $$PWD/./MyBrandIden/$$MY_ARCH
    #BrandIdentification_x86
    message("MY_ARCH: $$MY_ARCH")

    DESTDIR += $$PWD/bin/$$MY_ARCH

    message("DESTDIR: $$DESTDIR")
}
  • 优点:更换不同的编译器时,只需要改动很少一部分qmake代码
  • 缺点:暂时没找到...

参考文档:Qt 编译及自动部署 库 工具集(自动复制生成的库及头文件到指定的安装路径)

相关推荐
是有头发的程序猿23 分钟前
用Open Claw接口做1688选品、价格监控、货源对比
开发语言·c++·人工智能
Hello World . .31 分钟前
ARM裸机学习6——UART
arm开发·单片机·嵌入式硬件
斯班奇的好朋友阿法法41 分钟前
离线ollama导入Qwen3.5-9B.Q8_0.gguf模型
开发语言·前端·javascript
计算机安禾43 分钟前
【数据结构与算法】第19篇:树与二叉树的基础概念
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
Zarek枫煜1 小时前
[特殊字符] C3语言:传承C之高效,突破C之局限
c语言·开发语言·c++·单片机·嵌入式硬件·物联网·算法
somi71 小时前
ARM-10-I.MX6U ADC
arm开发·嵌入式硬件·adc·自用
是Smoky呢2 小时前
springAI+向量数据库+RAG入门案例
java·开发语言·ai编程
code_计梦星河2 小时前
Qt 开发第十五天:规划模块树形视图开发与跨端数据传输
qt
_Twink1e2 小时前
[算法竞赛]九、C++标准模板库STL常用容器大全
开发语言·c++
永恒_顺其自然2 小时前
Java Web 传统项目异步分块上传系统实现方案
java·开发语言·前端