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

news2024/11/16 17:37:12

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iTOP-RK3399开发板开发板作为客户端- ssh使用

默认使用本地用户为远程登录时的用户;远程连接虚拟机里面的 Ubuntu(IP 地址为 192.168.1.20), 如下图所示: ssh 192.168.1.20 以指定用户身份连接至服务器,输入以下命令: 输入 exit 退出 ssh 登录。 更多…

基础设施SIG月度动态:龙蜥大讲堂 - 基础设施系列专题分享火热进行中(7~8 月上旬持续分享),敬请关注!

基础设施 SIG(OpenAnolis Infra SIG)目标:负责 OpenAnolis 社区基础设施工程平台的建设,包括官网、Bugzilla、Maillist、ABS、ANAS、CI 门禁以及社区 DevOps 相关的研发工程系统。 01 SIG 整体进展 1、龙蜥大讲堂 - 基础设施系…

Vue3和Vue2对比学习之全局 API 应用实例

文章目录 0.前言1.参考文档2.详细说明2.1 全局 API 应用实例 非兼容2.2 一个新的全局 API:createAppconfig.productionTip 移除config.ignoredElements 替换为 config.isCustomElementVue.prototype 替换为 config.globalPropertiesVue.extend 移除类型推断组件继承…

最新年轻人副业赚钱攻略

最近几年,随着互联网的快速发展和社会变革的加速,年轻人副业赚钱的需求也越来越大。无论是为了增加收入、提升个人能力还是实现自我价值,年轻人们都纷纷开始寻找副业赚钱的机会。 那么,如何才能在副业赚钱中脱颖而出呢&#xff1…

软考笔记——10.项目管理

进度管理 进度管理就是采用科学的方法,确定进度目标,编制进度计划和资源供应计划,进行进度控制,在与质量、成本目标协调的基础上,实现工期目标。 具体来说,包括以下过程: (1) 活动定义&#…

Appium-移动端自动测试框架,如何入门?

Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门,那么我们就直奔主题。文章结构如下: 1、为什么要使用Appium? 2、如何搭建Appium工具环境?(超详细) 3、通过demo演示Appium的使用 4、Appium如何…

PD协议受电端芯片是什么?——浅谈快充协议在Hi003/XSP16应用

PD协议的全称是USB Power Delivery协议,该协议是基于USB 3.1中的Type-C接口,所以一般使用Type-C接口的充电器都有PD协议。 目前充电器常见的USB-PD功率为:5V3A(15W)、9V2A(18W)、12V3A&#xf…

扩散模型实战(四):从零构建扩散模型

推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 本文以MNIST数据集为例,从…

【Linux】POSIX信号量和基于环形队列的生产消费者模型

目录 写在前面的话 什么是POSIX信号量 POSIX信号量的使用 基于环形队列的生产消费者模型 写在前面的话 本文章主要先介绍POSIX信号量,以及一些接口的使用,然后再编码设计一个基于环形队列的生产消费者模型来使用这些接口。 讲解POSIX信号量时&#x…

阿里云服务器镜像大全_Linux和Windows操作系统清单

阿里云服务器操作系统大全,阿里云提供的镜像均为正版授权,正版镜像可以在云服务器ECS上运行的应用程序提供安全、稳定的运行环境系统,阿里云服务器以公共镜像为例分享阿里云服务器操作系统大全,包括Alibaba Cloud Linux镜像、Linu…

洁净室气流流型分类、检测及相关法规要求概览

洁净室气流形式可以分为单向流或非单向流两种。如果综合利用两种气流,通常叫做混合气流。单向流可以是垂直的或水平的。两种单向流都以最终过滤的送风和回风入口,它们几乎是相对设置,这样才能使气流的流动形式保持尽可能的呈直线状。确认气流…

java全局捕捉异常并返回统一返回值

1. 首先定义全局异常处理类 import org.springframework.validation.BindException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.…

vcsa6.7 vsan超融合,虚拟机突然识别不到加密狗

问题现象: vcsa6.7 vsan超融合,虚拟机突然识别不到加密狗,加密狗直通给虚拟机,打开设备管理器,有未知的usb设备,重启虚拟机,卸载tools,重新安装tools,都不行 问题解决…

面向对象编程(OOP):Python中的抽象与封装

文章目录 🍀引言🍀 类与对象🍀封装🍀继承🍀多态🍀面向对象编程的优势🍀使用面向对象编程的场景🍀实例化与构造函数🍀 成员属性和类属性🍀魔术方法&#x1f34…

opencv基础:几个常用窗口方法

开始说了一些opencv中的一些常用方法。 namedWindow方法 在OpenCV中,namedWindow函数用于创建一个窗口,并给它指定一个名字。这个函数的基本语法如下: import cv2cv2.namedWindow(窗口名称, 标识 )窗口名称:其实窗口名称&…

SqlServer Management工具格式化代码、美化SQL

1、下载simple but powerful SQL formatter 插件下载地址:地址 2、安装 点击next—> finish 3、重新打开SqlServer Management即可看到 SQL Beautifier 点击Format ALL SQL 或者选中sql点击Format Selected SQL即可

Linux的基本权限(文件,目录)

文章目录 前言一、Linux权限的概念二、Linux权限管理 1.文件访问者分类2.文件类型和访问类型3.文件访问权限的相关设置方法三、目录的权限四、权限的总结 前言 Linux下一切皆文件,指令的本质就是可执行文件,直接安装到了系统的某种路径下 一、Linux权限的…

交换实验一

题目 交换机上接口配置 SW1 interface GigabitEthernet0/0/1 port hybrid tagged vlan 2 port hybrid untagged vlan 3 to 6 interface Ethernet0/0/2 port hybrid pvid vlan 3 port hybrid untagged vlan 2 to 6 interface Ethernet0/0/3 port link-type access port d…

【NAS群晖drive异地访问】使用cpolar远程访问内网Synology Drive「内网穿透」

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

第 3 章 稀疏数组和队列(2)

3.2 队列 3.2.1队列的一个使用场景 银行排队的案例: 3.2.2队列介绍 队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出示意图:(使用数组模拟队列示意图) 3.2.3数组模拟队列思路…