QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库

QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库

  • 0、背景
  • 1、基本环境
  • 2、搭建交叉编译环境
  • 3、在交叉编译服务器上交叉编译安装unixODBC
    • 3.1 下载unixODBC
    • 3.2 交叉编译unixODBC
      • 3.2.1 基本编译说明
      • 3.2.2 交叉编译说明
      • 3.2.3 ./configure -build,-host,-target参数说明
      • 3.2.4 交叉编译unixODBC的具体过程
  • 4、交叉编译QT源码中的odbc.pro
  • 5、在交叉编译服务器上交叉编译安装freeTDS
    • 5.1 下载freeTDS
    • 5.2 交叉编译freeTDS
  • 6、把交叉编译生成的库部署到Linux Arm目标系统
    • 6.1 部署unixODBC
    • 6.2 部署freeTDS
    • 6.3 部署QT ODBC驱动
  • 7、编写ODBC配置
    • 7.1 配置freetds
    • 7.2 配置unixODBC

0、背景

在嵌入式系统中使用QT开发上位机应用时不可避免的会涉及访问各种数据库的场景,而服务端数据库的种类则有多种可能(Oracle、Postgresql、MySql、SQLServer),本文就介绍一下如何实现在Linux Arm环境下实现QT程序通过ODBC驱动访问SQLServer数据库的。

1、基本环境

开发环境操作系统:windows10专业版
QT版本:5.15.2
QT安装目录:D:\Qt
交叉编译环境操作系统:Ubuntu18.4
QT版本:5.15.2
QT安装目录:/opt/Qt
目标环境操作系统:Linux4.19 Arm 64
QT版本:5.15.2

2、搭建交叉编译环境

由于ARM开发板的内存资源和存储资源以及嵌入式操作系统的限制,我们不大可能在ARM开发板的系统上安装QT开发环境以及源码,ARM开发板通常作为最终的运行环境。我们用的笔记本或个人PC往往是X86处理器,因此在笔记本系统或个人PC中编译的QT程序是无法直接运行在ARM开发板上的。从开发电脑到ARM开发板是有2个关键的变化,1是操作系统从Windows变为了Linux,2是从X86处理器变为了ARM处理器。这就需要搭建一台交叉编译服务器(可以是一台独立的PC或者是虚拟机),交叉编译服务器的操作系统要为Linux,示意如下:
在这里插入图片描述

交叉编译环境的搭建主要是获得对应的交叉编译工具链,就是在X86处理器上运行的Linux系统中使用交叉编译工具链对X86的Windows下开发的源码进行交叉编译生成基于Arm处理器的Linux系统能够运行的目标程序。

通常我们管X86的Windows开发环境叫开发环境,X86的Linux环境叫交叉编译环境,Arm的Linux环境叫目标环境或运行环境。最简单搭建交叉编译环境的方式就是直接使用目标开发版操作系统的编译服务器作为交叉编译服务器。不过这个环境一般比较大,因为操作系统的源码非常大。要想用一个轻量级的交叉编译环境,还是建议自己搭建。

本文后面介绍的是直接采用的操作系统编译服务器作为交叉编译环境的。

3、在交叉编译服务器上交叉编译安装unixODBC

3.1 下载unixODBC

1、unixODBC的官网地址为:https://www.unixodbc.org/
如下图:
在这里插入图片描述
2、如要下载最新版本,则点击左侧菜单中的Download,如下图:
在这里插入图片描述
3、如果要下载历史版本,可以通过ftp://ftp.unixodbc.org/pub/unixODBC网址下载需要的版本,如下图:
在这里插入图片描述
4、因为Linux Arm目标环境中安装的版本是2.3.4,为了一致,所以在交叉编译服务器上我也下载这个版本,如下:

cd /usr/local/src
wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.4.tar.gz

如下图:
在这里插入图片描述
5、然后就可以对其进行解压了,如下:

tar -xzvf unixODBC-2.3.4.tar.gz
ls

如下图:
在这里插入图片描述

3.2 交叉编译unixODBC

3.2.1 基本编译说明

1、在官网的下载页面已经介绍了基本的安装步骤,如下:
1.1 默认安装如下:

./configure
make
make install

1.2 指定目录安装如下:

./configure --prefix=/usr/local/unixODBC
make
make install

1.3 指定配置路径安装如下:

./configure --sysconfdir=/etc
make
make install

当然,1.2 1.3可以结合在一起。
在这里插入图片描述

3.2.2 交叉编译说明

1、要想对c/c++源码进行交叉编译,首先要在交叉编译服务器上安装配置交叉编译工具链。这里就不介绍安装过程了,为了能够保证与目标系统一致,我使用的就是构建目标操作系统时生成的交叉编译环境,目录为:LinuxSDK/buildroot/output/rockchip_rk3568/host/bin/。如下图:
在这里插入图片描述
上图中可以看出:

交叉编译工具链所在目录为:/home/zhenglb/Linux/wg_rk356x_linux_sdk/buildroot/output/rockchip_rk3568/host/bin
交叉编译工具链名称为:aarch64-buildroot-linux-gnu

2、需要把交叉编译器所在的路径添加到PATH环境变量中,方便系统能找到交叉编译器,如下:

echo $PATH
export PATH=$PATH:/home/zhenglb/Linux/wg_rk356x_linux_sdk/buildroot/output/rockchip_rk3568/host/bin
echo $PATH

如下图:
在这里插入图片描述

3.2.3 ./configure -build,-host,-target参数说明

在对c/c++源码进行交叉编译的时候,关键的一步是设置configure的参数,其中有三个参数-build、-host、-target的区别如下:

  • build:执行代码编译的主机,正常的话就是你的主机系统。这个参数一般由config.guess来猜就可以。当然自己指定也可以。
  • host:编译出来的二进制程序所执行的主机,因为绝大多数是本机编译,本机执行,所以这个值就等于build。只有交叉编译的时候(也就是本机编译,其他系统机器执行)才会build和host不同。用host指定运行主机。
  • target:这个选项只有在建立交叉编译环境的时候用到,正常编译和交叉编译都不会用到。他用build主机上的编译器,编译一个新的编译器(binutils, gcc,gdb等),这个新的编译器将来编译出来的其他程序将运行在target指定的系统上。

3.2.4 交叉编译unixODBC的具体过程

1、下面就看一下在交叉编译服务器上的交叉编译安装步骤,如下:

cd unixODBC-2.3.4
./configure --prefix=/usr/local/arm/unixODBC --host=aarch64-buildroot-linux-gnu
make
make install

日志太长,就不截图了。–prefix指定了安装位置,–host指定了交叉编译工具链

3、安装完毕后,就会在/usr/local/arm目录下看到unixODBC目录了,如下图:
在这里插入图片描述

  • 在/usr/local/arm/unixODBC/include目录下是我们交叉编译odbc.pro所依赖的unixODBC的头文件
  • 在/usr/local/arm/unixODBC/lib目录下是我们交叉编译odbc.pro所依赖的库

如下图:
在这里插入图片描述

4、交叉编译QT源码中的odbc.pro

1、首先在交叉编译服务器上进入odbc.pro源码目录,如下:

cd /opt/Qt/5.15.2/Src/qtbase/src/plugins/sqldrivers/odbc
ls

如下图:
在这里插入图片描述
2、修改odbc.pro文件添加指定unixODBC头文件及库文件的位置的相关代码,如下:

vim odbc.pro

odbc.pro修改的内容

#注释下行
#QMAKE_USE += odbc
#增加以下2行
INCLUDEPATH += /usr/local/arm/unixODBC/include
LIBS += -L/usr/local/arm/unixODBC/lib -lodbc

如下图:
在这里插入图片描述
3、按:wq,保存退出odbc.pro文件的编辑
4、使用交叉编译工具链下的qmake生成Makefile,如下:
这里我使用的是目标Linux操作系统构建时生成的交叉编译工具链,位置为:
LinuxSDK/buildroot/output/rockchip_rk3568/host/bin/qmake,如下图:
在这里插入图片描述
(如果在此终端下已配置了交叉编译工具链的PATH环境变量,可以直接qmake)具体使用如下:
在这里插入图片描述
5、然后输入make命令进行交叉编译,交叉编译完毕后会在原木odbc目录同级目录生成plugins/sqldrivers目录,交叉编译生成的库文件就这这个目录中,如下图:
在这里插入图片描述

5、在交叉编译服务器上交叉编译安装freeTDS

5.1 下载freeTDS

1、freeTDS的官网地址为:https://www.freetds.org/
如下图:
在这里插入图片描述
2、通过ftp://ftp.freetds.org/pub/freetds/可以查看历史版本,如下图:
在这里插入图片描述
3、在开发环境下可以直接点击右侧菜单中的Stable Release进行下载。或者通过右键查看属性获取到下载地址,如下图:
在这里插入图片描述
4、在交叉编译服务器上通过wget直接下载freetds到交叉编译服务器中,如下:

cd /usr/local/src
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.3.19.tar.gz

如下图:

在这里插入图片描述
5、然后就可以解压了,如下:

tar -xzvf freetds-1.3.19.tar.gz
ls

在这里插入图片描述

5.2 交叉编译freeTDS

1、首先,如果PATH环境变量中没有指定交叉编译器的路径,则需要把交叉编译器所在的路径添加到PATH环境变量中,方便系统能找到交叉编译器,如下:

echo $PATH
export PATH=$PATH:/home/zhenglb/Linux/wg_rk356x_linux_sdk/buildroot/output/rockchip_rk3568/host/bin
echo $PATH

1、下面就看一下在交叉编译服务器上的交叉编译安装步骤,如下:

cd freetds-1.3.19
./configure --prefix=/usr/local/arm/freetds --host=aarch64-buildroot-linux-gnu --with-tdsver=7.1 --disable-libiconv
make
make install

日志太长,就不截图了。–prefix指定了安装位置,–host指定了交叉编译工具链

3、安装完毕后,就会在/usr/local/arm目录下看到freetds目录了,如下图:
在这里插入图片描述

6、把交叉编译生成的库部署到Linux Arm目标系统

6.1 部署unixODBC

如果目标系统中没有unixODBC,则部署方式与6.2 部署freeTDS类似。因为我的目标系统已经有unixODBC了,并且安装时没有指定安装目录,是属于默认安装的。
因此配置文件路径为/etc/odbc.ini、/etc/odbcinst.ini。so库在/usr/lib目录下

6.2 部署freeTDS

1、首先把第5步在交叉编译服务器上交叉编译freeTDS后的安装目录/usr/local/arm/freetds压缩一下,如下:

cd /usr/local/aram
tar -cvf freetds.tar freetds

2、把压缩包freetds.tar从交叉编译服务器下载后,传到目标系统(Linux Arm)中。

注意:一定要相同目录

如下图:
在这里插入图片描述
3、然后在目标系统中对其进行解压。

6.3 部署QT ODBC驱动

把第4步在交叉编译服务器上交叉编译QT源码中的odbc.pro生成的libqsqlodbc.so复制到目标系统(Linux Arm)的qt的插件目录下,如下图:
复制前:
在这里插入图片描述
复制后:
在这里插入图片描述

7、编写ODBC配置

7.1 配置freetds

修改/usr/local/aram/freetds/etc/freetds.conf,添加如下内容:

[SQLSERVER]
       host = xxx.xxx.xxx.xxx
       port = 1433
       tds version = 8.0
       client charset = UTF-8

7.2 配置unixODBC

修改/etc/odbcinst.ini,添加如下内容:

[FreeTDS]
Description = FreeTDS unixODBC Driver
Driver = /usr/local/arm/freetds/lib/libtdsodbc.so
UsageCount = 1

修改/etc/odbc.init,添加如下内容:

[testdsn]
Driver = FreeTDS
Description = MS SQL Server
Servername = testdsn
Database = test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/78100.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Ble蓝牙App(五)数据操作

Ble蓝牙App(五)数据操作 前言目录正文一、操作内容处理二、读取数据① 概念② 实操 三、写入数据① 概念② 实操 四、打开通知一、概念二、实操三、收到数据 五、源码 前言 关于低功耗蓝牙的服务、特性、属性、描述符都已经讲清楚了,而下面就…

golang—面试题大全

目录标题 sliceslice和array的区别slice扩容机制slice是否线程安全slice分配到栈上还是堆上扩容过程中是否重新写入go深拷贝发生在什么情况下?切片的深拷贝是怎么做的copy和左值进行初始化区别slice和map的区别 mapmap介绍map的key的类型map对象如何比较map的底层原…

6939. 数组中的最大数对和

题目描述: 给你一个下标从 0 开始的整数数组 nums 。请你从 nums 中找出和 最大 的一对数,且这两个数数位上最大的数字相等。 返回最大和,如果不存在满足题意的数字对,返回 -1 。 示例: 解题思路: 使用数组…

LangChain源码逐行解密之系统(一)

LangChain源码逐行解密之系统 1.1 search.py源码逐行剖析 本节将通过源代码与大家分享,LangChain框架作为核心的企业级大模型开发的最后一个环节,即代理(Agent)环节。之前我们已经多次提到代理,并从源代码和案例的角度对多个代理进行了剖析,如图20-1所示。Gavin大咖微信:…

opencv实战项目 手势识别-手势音量控制(opencv)

本项目是使用了谷歌开源的框架mediapipe,里面有非常多的模型提供给我们使用,例如面部检测,身体检测,手部检测等。 手势识别系列文章 1.opencv实现手部追踪(定位手部关键点) 2.opencv实战项目 实现手势跟踪…

认识容器,走进Docker

文章目录 容器技术简介容器的核心技术容器平台技术容器的支持技术 Docker理念Docker安装配置阿里云镜像加速器 容器技术简介 一切在云端,万物皆容器,说到容器,大家都会想到Docker,Docker现在几乎是容器的代名词,什么是Docker&…

python开发环境准备

python开发环境准备 文章目录 python开发环境准备windows安装配置python3下载配置 安装pip(通过get-pip.py)测试与问题 测试python windows安装配置python3 校验日期 :2023年8月11日 下载 下载地址 官网地址 版本分为推荐下载最新的版本和…

udp与can通信的选择与比较

UDP(用户数据报协议)和CAN(控制器局域网)是两种不同的通信协议,它们在实时传递性上有一些区别。 UDP是一种无连接的传输协议,它提供了简单的、不可靠的数据传输。UDP不提供可靠性保证、流控制或重传机制。…

【数据结构】堆的初始化——如何初始化一个大根堆?

文章目录 源码是如何插入的?扩容向上调整实现大根堆代码: 源码是如何插入的? 扩容 在扩容的时候,如果容量小于64,那就2倍多2的扩容;如果大于64,那就1.5倍扩容。 还会进行溢出的判断&#xff0c…

uniapp 获取 view 的宽度、高度以及上下左右左边界位置

<view class"cont-box"></view> /* 获取节点信息的对象 */ getElementRect() {const query uni.createSelectorQuery().in(this);query.select(".cont-box").boundingClientRect(res > {console.log(res);console.log(res.height); // 10…

半导体退火那些事(2)

2.半导体退火的作用 2.1改善半导体的电学性能 退火过程中&#xff0c;材料中的缺陷得到修理&#xff0c;杂质原子和材料内的杙错得到排列&#xff0c;位于能带中动力学的载流子少&#xff0c;能级也就相对于更加密集。因而在退火之后&#xff0c;半导体材料中的电子、空穴浓度…

【计算机网络篇】UDP协议

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; UDP协议 1&#xff0c;UDP 简介 UDP&#xff08;User Datagram Protocol&#xff09;是一种无连…

序列模型和循环网络

Sequence Modeling and Recurrent Networks Sequence modeling tasks 在以往的模型中&#xff0c;各个输入之间是独立分布的 x ( i ) x^{(i)} x(i) 之间是相互独立的&#xff0c;同样输出 y ( i ) y^{(i)} y(i)之间也是相互独立的。 但是在序列模型中&#xff0c;输入输出是…

Windows电脑快速搭建FTP服务教程

FTP介绍 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于在计算机网络上进行文件传输的标准协议。它提供了一种可靠的、基于客户端-服务器模型的方式来将文件从一个主机传输到另一个主机。在本文中&#xff0c;我将详细介绍FTP的工作原理、数据传输模式以及常见…

Fortinet数据中心防火墙及服务ROI超300%,Forrester TEI研究发布

近日&#xff0c;专注网络与安全融合的全球网络安全领导者 Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;联合全球知名分析机构Forrester发布总体经济影响独立分析报告&#xff0c;详细阐述了在企业数据中心部署 FortiGate 下一代防火墙&#xff08;NGFW&#xff09…

postgresql 分类排名

postgresql 分类排名 排名窗口函数示例CUME_DIST 和 NTILE 排名窗口函数 排名窗口函数用于对数据进行分组排名。常见的排名窗口函数包括&#xff1a; • ROW_NUMBER&#xff0c;为分区中的每行数据分配一个序列号&#xff0c;序列号从 1 开始分配。 • RANK&#xff0c;计算每…

基于YOLOv8模型的人体摔倒行为检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的人体摔倒行为检测系统可用于日常生活中检测与定位摔倒行人&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

214、仿真-基于51单片机温度甲醛一氧化碳(co)电机净化报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&a…

Qt5开发环境-银河麒麟V10ARM平台

目录 前言1.源码下载2.编译安装2.1 安装依赖2.2 编译2.3 遇到的问题2.4 安装 3.编译qtwebengine3.1 安装依赖库3.2 编译3.3 遇到的问题3.4 安装 4.配置开发环境5.测试6.程序无法输入中文的问题总结 前言 近期因参与开发的某个软件需要适配银河麒麟v10arm 平台&#xff0c;于是…

C++之map的emplace与pair插入键值对用例(一百七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…