第八篇 交叉编译华为云Iot SDK到Orangepi3B
本篇主要内容:
- 一、交叉编译华为云Iot SDK依赖
- 1.宿主机安装交叉编译工具链
- (1)选择下载交叉编译工具链
- (2)解压、添加环境变量、重启
- 2.交叉编译依赖库
- (0) 准备工作
- (1) 交叉编译openssl
- (2) 交叉编译paho
- (3) 交叉编译zlib
- (4) 交叉编译华为安全函数库
- (★5)交叉编译libssh
- (★6)交叉编译libnopoll
- 二、移植SDK测试用例到OrangePi 3B运行
- (1)配置交叉编译华为云Iot SDK
- (2)在华为云上创建"设备接入ioTDA"服务
- (3)在Orangepi 3B上运行测试用例
- 三、在cmake项目中使用SDK
- (1)将SDK交叉编译成动态库
- (2)在cmake中引入SDK动态库
一、交叉编译华为云Iot SDK依赖
🔖开发板: Orangepi 3B
🔖目标操作系统: Orangepi3b_1.0.0_ubuntu_jammy_desktop_xfce_linux6.6.0-rc5
🔖编译平台: ubuntu22.04_x86_64虚拟机
🔖交叉编译器: gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
(注意:这里要清楚开发板和编译平台/宿主机各自的操作系统架构,下面才能正确选择交叉编译器)
🔖说明: 这里参考了官方提供的文档,可能由于版本更迭,按照文档的步骤有报错,而且文档没有提供可参考的交叉编译的使用说明,出错的解决方法网上也比较少,个人感觉不太友好。在文档中,分别编译了openssl库、paho库、zlib库、华为安全函数boundscheck库、libssh库、libnopoll库。下面是交叉编译这6个库移植到OrangePi3B的步骤,其中带★的库可以省略跳过,如果需求只是连接到iot平台,上报数据、发布命令,实现远程控制的基本功能的话,只需要移植不带★的库即可,在官方论坛有看到仅编译openssl和paho即可,经过测试不适用,还需要zlib和boundscheck,可能sdk新旧版本的不同。
1.宿主机安装交叉编译工具链
(1)选择下载交叉编译工具链
交叉编译工具链官方下载地址(国外)
交叉编译工具链清华开源镜像站下载地址(国内)
(2)解压、添加环境变量、重启
sudo tar -xvf arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /mnt
sudo vi /etc/environment
# 添加路径:/mnt/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu/bin
sudo reboot #重启永久生效,也可以使用命令source /etc/environment,仅在当前会话生效
输入aarch按tab键能补全aarch64-none-linux-gnu-就可以了,也可以使用aarch64-none-linux-gnu-gcc -v查看版本
2.交叉编译依赖库
(0) 准备工作
sudo mkdir ~/mqtt_sdk && cd mqtt_sdk # 在根目录下新建目录,存放以下编译过程库的源码和过程文件
sudo git clone https://github.com/huaweicloud/huaweicloud-iot-device-sdk-c.git # 下载SDK源码
下面开始交叉编译sdk所需要的库,所有的库源码都下载到~/mqtt_sdk下
(1) 交叉编译openssl
sudo wget https://www.openssl.org/source/openssl-3.2.0.tar.gz # 下载源码
sudo tar -zxvf openssl-3.2.0.tar.gz && sudo rm openssl-3.2.0.tar.gz && cd openssl-3.2.0/ # 解压
sudo ./config no-asm --prefix=$(pwd)/_install --cross-compile-prefix=/mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
#配置,没有生成Makefile需要检查这一步,注意 要使用绝对路径,no-asm表示不使用汇编代码
# 接着我们vi打开生成的Makefile,搜索-m64有的可能是-m32,将这些链接选项都删掉,下面编译才不会报错
sudo make depend && sudo make -j20 #添加依赖并开始编译
sudo make install -j20 # 安装
编译完成后已经在顶层目录生成交叉编译的库文件,个人感觉也可以不用安装,直接拷贝这些文件。安装完成后,在源码目录下的_install/openssl/lib64生成的库文件,我们可以通过file libssl.so.3查看是否是交叉编译生成的目标平台文件
# 最后,直接把_install/目录下我们需要的库文件和头文件拷贝到SDK源码里
sudo cp _install/lib64/lib* ../huaweicloud-iot-device-sdk-c/lib/ # 库文件
sudo cp -r _install/include/openssl/ ../huaweicloud-iot-device-sdk-c/include/ # 头文件
(2) 交叉编译paho
sudo git clone https://github.com/eclipse/paho.mqtt.c.git # 获取源码
编译paho库需要使用到openssl库以及头文件,这里需要在Makefile中先指定好
cd paho.mqtt.c/ && sudo vi Makefile #打开Makefile,搜索DOXYGEN_COMMAND这个字段,在下面加入链接openssl的路径,再指定编译器
LDFLAGS += -L/home/$(shell logname)/mqtt_sdk/openssl-3.2.0/_install/lib64 -lrt
CFLAGS += -I/home/$(shell logname)/mqtt_sdk/openssl-3.2.0/_install/includeCC ::= /mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc # 如图所示
sudo make clean && sudo make -j20 # 开始编译,这里没有配置安装路径就不安装了
#编译完成后,可以在build/output/目录下看到生成的库和头文件,和前面一样,我们直接拷贝到桌面lib目录;
sudo cp build/output/libpaho-mqtt3* ../huaweicloud-iot-device-sdk-c/lib/ #拷贝库文件
sudo cp src/*.h ../huaweicloud-iot-device-sdk-c/include/base/ #头文件需要拷贝的sdk目录下include/base
(3) 交叉编译zlib
sudo wget https://github.com/madler/zlib/archive/v1.2.11.zip # 下载源码
sudo unzip v1.2.11.zip && sudo rm v1.2.11.zip && cd zlib-1.2.11/ # 解压源码并删除压缩包
sudo CC=/mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc ./configure --prefix=$(pwd)/_install --libdir=$(pwd)/_install/lib --includedir=$(pwd)/_install/include #配置交叉编译工具、安装路径等
sudo make -j20 && sudo make install # 编译、安装
sudo cp _install/lib/libz.* ../huaweicloud-iot-device-sdk-c/lib/ # 拷贝库
sudo cp -r _install/include/ ../huaweicloud-iot-device-sdk-c/include/zlib # 拷贝头文件
(4) 交叉编译华为安全函数库
sudo git clone https://gitee.com/openeuler/libboundscheck.git && cd libboundscheck/ # 获取源码
# vi打开Makefile,直接将CC?=gcc改成下面这样,sudo make在lib目录下生成libboundscheck.so即可
CC::=/mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
sudo make -j20 #编译
sudo cp lib/libboundscheck.so ../huaweicloud-iot-device-sdk-c/lib/ # 拷贝库文件
到这里就完成sdk依赖库的编译(对于只需要设备接入、上报数据和下发命令就足够了),以下是官方文档提到其它依赖库交叉编译
(★5)交叉编译libssh
sudo wget https://www.libssh.org/files/0.10/libssh-0.10.6.tar.xz # 下载源码
sudo tar -xvf libssh-0.10.6.tar.xz && sudo rm libssh-0.10.6.tar.xz && cd libssh-0.10.6/ # 解压
libssh使用cmake构建项目,这里我们直接打开源码顶层目录的CMakeList.txt,在前面增加以下内容即可
# 指定交叉编译器
set(CROSS_COMPILE /mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-)
set(CMAKE_C_COMPILER ${CROSS_COMPILE}gcc)
set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}g++)# 指定INSTALL、README提到的几个选项
set(ZLIB_LIBRARY /home/zzk/mqtt_sdk/zlib-1.2.11/_install/lib)
set(ZLIB_INCLUDE_DIR /home/zzk/mqtt_sdk/zlib-1.2.11/_install/include)
set(OPENSSL_ROOT_DIR /home/zzk/mqtt_sdk/openssl-3.2.0)# 指定最后链接ld库的选项
link_libraries("-L /home/zzk/mqtt_sdk/openssl-3.2.0/_install/lib64 -lcrypto")
link_libraries("-L /home/zzk/mqtt_sdk/zlib-1.2.11/_install/lib -lz")
sudo mkdir build && cd build # 新建build目录用于构建项目,源码中INSTALL和README有讲到
sudo cmake ..
sudo make -j20 # 编译,完成后再build/lib生成libssh.so.4.9.6;这里如果按照官方手册install就安装到了系统
sudo cp lib/libssh.so* ../../huaweicloud-iot-device-sdk-c/lib/ #拷贝库文件
sudo cp -r include/libssh/ ../../huaweicloud-iot-device-sdk-c/include/ #拷贝 头文件
(★6)交叉编译libnopoll
这个库的INSTALL和README只有一个官网地址,报错解决方法很难找。如果在编译过程中,遇到./nopoll_decl.h:539:1: error: empty enum is invalid.优先排查openssl链接路径,再考虑openssl编译过程是否正确
sudo wget http://www.aspl.es/nopoll/downloads/nopoll-0.4.8.b429.tar.gz # 下载源码
sudo tar -xvf nopoll-0.4.8.b429.tar.gz && sudo rm nopoll-0.4.8.b429.tar.gz # 解压
cd nopoll-0.4.8.b429/
sudo ./configure --prefix=$(pwd)/_install --host=aarch64-none-linux-gnu CC=/mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc CFLAGS=-I/home/zzk/mqtt_sdk/openssl-3.2.0/_install/include LDFLAGS=-L/home/zzk/mqtt_sdk/openssl-3.2.0/_install/lib64 LIBS="-lssl -lcrypto" # 缺少LIBS会编译报错
sudo make -j20
# 在顶层目录_install下生成include和lib,同上,拷贝到SDK
sudo cp _install/lib/libnopoll.* ../huaweicloud-iot-device-sdk-c/lib/
sudo cp _install/include/nopoll/*.h ../huaweicloud-iot-device-sdk-c/include/nopoll/
二、移植SDK测试用例到OrangePi 3B运行
(1)配置交叉编译华为云Iot SDK
cd huaweicloud-iot-device-sdk-c/ #切换到sdk目录
sudo vi Makefile #打开顶层目录的Makefile
打开SDK顶层的Makefile,第一行就是编译器路径,修改为交叉编译工具链,如下
暂时还不编译,我们到华为云创建iot服务,再修改sdk目录下src/device_demo/device_demo.c,连接到平台进行测试
注意:目前sdk默认使用的是mqtt3.1.1,本版本也支持mqtt5.0,不过需要在顶层目录找到/include/util/mqttv5_util.h,搜索找到#define MQTTV5,并把注释取消;在Makefile中找到MQTTV5 := 1,把注释删掉即可完成编译。
(2)在华为云上创建"设备接入ioTDA"服务
大致步骤:开通服务->控制台创建产品->创建设备(详细步骤可见SDK源码中的README),之后会得到如下的MQTT连接参数(三元组)
sudo vi src/device_demo/device_demo.c # 打开这个程序,填入连接参数
注意:按照sdk文档,理论上到这里编译出的示例程序在开发板运行是不会出错的,实际上运行效果却是连接不上服务器,程序也不会异常退出,一直卡在---- start test -----,这是比较坑的地方,如果遇到了这种异常,优先排查nopoll和openssl库的编译过程,因为在宿主机上编译,如果链接路径和头文件路径没有指定清楚,可能会被系统自带的x86 openssl库影响
sudo make -j20 # 编译程序,得到如下的可执行程序MQTT_Demo
file MQTT_Demo # 查看该程序运行的平台
readelf -d MQTT_Demo | grep NEEDED # 查看该程序运行时需要链接的库
除了可执行程序MQTT_Demo外,还需要将这些动态库拷贝到开发板,为了方便这里就直接拷贝sdk里的lib/目录
(3)在Orangepi 3B上运行测试用例
根据上面的信息,将可执行程序和链接库(包括其软链接)一起打包,上传到目标主机OrangePi 3B
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/lib/ #导入链接库环境变量
./MQTT_Demo #运行,成功结果如下:
三、在cmake项目中使用SDK
到这里,我们已经完成SDK及其依赖库的交叉编译,为了将SDK集成到我们的项目中,这里可以将SDK交叉编译成动态库,我们可以在cmake或者Makefile中引入该动态库和相关头文件,就可以更方便地使用SDK了,并且像CLion、VScode等IDE也有代码提示,方便代码编写
(1)将SDK交叉编译成动态库
sudo vi Makefile #打开顶层目录的Makefile,修改如下
sudo make clean #清理
sudo make -j20 #重新编译
🔖 接着在顶层目录生成动态库libHWMQTT.so ,将动态库(及其依赖库)拷贝到项目中的lib目录,头文件拷贝到include目录,最后在CMakeList.txt或者是Makefile中去引入即可。
(2)在cmake中引入SDK动态库
🔖 CMakeList.txt(实际环境不唯一,仅供参考):
cmake_minimum_required(VERSION 3.22.1)# 交叉编译器
set(CROSS_COMPILE /mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-)
set(CMAKE_C_COMPILER ${CROSS_COMPILE}gcc)
project(smartHome_v2.0_rebuild C)# 包含SDK头文件
set(SDK_INCLUDE_PATH ${CMAKE_SOURCE_DIR}/include)
include_directories(${SDK_INCLUDE_PATH})
include_directories(${SDK_INCLUDE_PATH}/protocol)
include_directories(${SDK_INCLUDE_PATH}/util)
include_directories(${SDK_INCLUDE_PATH}/base)
include_directories(${SDK_INCLUDE_PATH}/agentlite)
include_directories(${SDK_INCLUDE_PATH}/service)
# SDK依赖库链接路径
set(SDK_LIBS_PATH ${CMAKE_SOURCE_DIR}/lib)
link_libraries("-L ${SDK_LIBS_PATH} -lHWMQTT")
link_libraries("-L ${SDK_LIBS_PATH} -lpaho-mqtt3as")
link_libraries("-L ${SDK_LIBS_PATH} -lssl")
link_libraries("-L ${SDK_LIBS_PATH} -lcrypto")
link_libraries("-L ${SDK_LIBS_PATH} -lboundscheck")
link_libraries("-L ${SDK_LIBS_PATH} -lz")# 包含系统头文件和系统库
include_directories(/usr/include/cjson)
include_directories(/usr/include)
include_directories(/usr/local/include)# 本项目头文件
include_directories(src/device)# 源文件
set(OBJS src/light.c src/voice_ctl.c src/main.c src/device/device.c)
set(CMAKE_C_STANDARD 11)
add_executable(main ${OBJS})
相关文章:
第八篇 交叉编译华为云Iot SDK到Orangepi3B
本篇主要内容: 一、交叉编译华为云Iot SDK依赖1.宿主机安装交叉编译工具链(1)选择下载交叉编译工具链(2)解压、添加环境变量、重启2.交叉编译依赖库(0) 准备工作(1) 交叉…...
软件工程测试2
1.【单选】“数据流的分解一般达到2层数据流就截止”的说法是否正确 A. 正确 B. 错误 答案:B 2.【单选】 在类图中,哪种关系表达总体与局部的关系 A. 泛化 B. 实现 C. 聚合 D. 依赖 答案:C 3.【多选】从UML时序图中我们能够得到(…...
31.【TypeScript 教程】混入(Mixins)
TypeScript 混入(Mixins) 混入(Mixins)是面向对象编程中的一个比较重要的概念。本节将会通过一个实例逐步介绍混入是如何在 TypeScript 中使用的。 1. 解释 在 TypeScript 中,可以根据不同的功能定义多个可复用的类,它们将作为 …...
C语言常见面试题:什么是联合体,联合体的作用是什么?
联合体(union)是一种特殊的数据类型,它可以在同一块内存单元中存储不同的数据类型。联合体的作用在于能够节省内存空间,并且可以用来实现数据的共享和交换。 联合体的定义方式是在C语言中通过关键字union来定义,例如&…...
Nginx进阶篇【五】
Nginx进阶篇【五】 八、Nginx实现服务器端集群搭建8.1.Nginx与Tomcat部署8.1.1.环境准备(Tomcat)8.1.1.1.浏览器访问:8.1.1.2.获取动态资源的链接地址:8.1.1.3.在Centos上准备一个Tomcat作为后台web服务器8.1.1.4.准备一个web项目,将其打包为war8.1.1.5.启动tomcat进…...
IndexedDB
Web SQL Database | Can I use... Support tables for HTML5, CSS3, etc IndexedDB | Can I use... Support tables for HTML5, CSS3, etc 为什么websql被废弃?_笔记大全_设计学院 WebSQL有兼容、性能、安全问题,要考虑使用IndexedDB替代。 一文看懂 In…...
git用法总结
以gitee为例,GitHub也可参考本文 创建远程仓库 在自己的gitee主页 创建本地仓库 在文件夹下,右键→git bash here git init添加gitignore vi .gitignoregitignore里的内容根据自己实际情况设置,这里举个例子 # #开头的是注释 # Prer…...
统计学-R语言-7.3
文章目录 前言总体方差的检验一个总体方差的检验两个总体方差比的检验 非参数检验总体分布的检验正态性检验的图示法Shapiro-Wilk和K-S正态性检验总体位置参数的检验 练习 前言 本篇文章继续对总体方差的检验进行介绍。 总体方差的检验 一个总体方差的检验 在生产和生活的许多…...
在Idea中使用git查看历史版本
idea查git历史 背景查看步骤总结 背景 有好几次同事到我电脑用idea查看git管理的历史记录,每次都说我的idea看不了历史版本,叫我到他电脑上去看,很晕,为什么,原来是我自己把显示历史文件的视图覆盖了,下面我们来一起学…...
书籍 - 《华杉讲透孙子兵法》 - 11
第十章 地形第十 六种地形的用兵之道(一):先占有利地形 我们读兵法,会发现很多时候,等待都是最好的策略。你一定要懂得等,等得起。有的人不能等,总以为等待就是不作为,那就容易“胡作…...
2024 axios封装 包括请求拦截、错误码等
1.新建 codeMessage.ts export default {200: "服务器成功返回请求的数据。",201: "新建或修改数据成功。",202: "一个请求已经进入后台排队(异步任务)。",204: "删除数据成功。",400: "发出的请求有错误…...
Kotlin Multiplatform项目推荐 | 太空人分布图
Kotlin Multiplatform项目推荐 | 太空人分布图 项目简介 Kotlin Multiplatform项目是一种跨平台开发技术,它可以同时使用SwiftUI、Jetpack Compose、Compose for Wear OS、Compose for Desktop、Compose for Web、Kotlin/JS React等客户端框架,并且使…...
使用Opencv-python库读取图像、本地视频和摄像头实时数据
使用Opencv-python库读取图像、本地视频和摄像头实时数据 Python中使用OpenCV读取图像、本地视频和摄像头数据很简单, 首先需要安装Python,然后安装Opencv-python库 pip install opencv-python然后在PyCharm或者VScode等IDE中输入对应的Python代码 一…...
webpack如何把dist.js中某个模块js打包成一个全局变量,使得在html引入dist.js后可以直接访问
webpack可以通过使用expose-loader来将模块中的一个js文件暴露为全局可以访问的变量。下面是一个示例代码: 1、安装expose-loader npm install expose-loader --save-dev 2、webpack.config.js配置文件 值得注意的是:我在本地使用16.14.2版本的node打包…...
Mysql第一天
数据库概述 1. 为什么要使用数据库 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。(可掉电:内存 使用高电压和低电压来区别0和1进行数据的一个存储但是一旦断电了电压都没了 0和1也就没有了)大多数情况下,特别是企 业级应用&#…...
用C语言实现贪吃蛇游戏!!!(破万字)
前言 大家好呀,我是Humble,不知不觉在CSND分享自己学过的C语言知识已经有三个多月了,从开始的C语言常见语法概念说到C语言的数据结构今天用C语言实现贪吃蛇已经有30余篇博客的内容,也希望这些内容可以帮助到各位正在阅读的小伙伴…...
uniapp 使用echarts做折线图条形图。
提前10天把中烟活动做完了,以为能打酱油到除夕那天,结果又要做什么数据看板,方便烟草领导过年查看数据,还只给5天时间,真实压榨剥削啊,下辈子再也不‘拍黄片’了,不!下份工作我就转前…...
美易平台:诺基亚四季度财报超预期
正文: 近日,诺基亚发布了其四季度财报,显示调整后营业利润达到了8.46亿欧元,超出市场预估的7.627亿欧元。同时,调整后每股收益(EPS)为0.10欧元,符合市场预期。这一成绩表明诺基亚在…...
大数据学习之Flink算子、了解(Source)源算子(基础篇二)
Source源算子(基础篇二) 目录 Source源算子(基础篇二) 二、源算子(source) 1. 准备工作 2.从集合中读取数据 可以使用代码中的fromCollection()方法直接读取列表 也可以使用代码中的fromElements()方…...
抖去推短视频矩阵系统+实景无人直播系统技术源头开发
抖去推爆款视频生成器,通过短视频矩阵、无人直播,文案引流等,打造实体商家员工矩阵、用户矩阵、直播矩阵,辅助商家品牌曝光,团购转化等多功能赋能商家拓客引流。 短视频矩阵通俗来讲就是批量剪辑视频和批量发布视频&a…...
【机器学习】一文读懂统计学与机器学习的区别。
统计学与机器学习的区别 1、机器学习2、统计学3、统计学与机器学习异同性3.1 差异性3.2 相似性 4、总结 1、机器学习 关于机器学习,我想大家都很熟悉,这里我再简单唠叨一些 机器学习是人工智能的一个子领域,主要关注如何通过算法使计算机系统…...
燃烧的指针(二)
🌈个人主页:小田爱学编程 🔥 系列专栏:c语言从基础到进阶 🏆🏆关注博主,随时获取更多关于c语言的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &#x…...
【工具使用-Everything】everything只能搜到文件夹,无法搜到文件
一,问题现象 everything搜索时,只能搜索到文件夹,无法搜索到文件夹下的文件。 二,问题原因 everything搜索设置问题,设置为"文件夹"导致 三,解决方法 将搜索选项设置为“所有”即可&#x…...
手写rpc和redis
rpc框架搭建 consumer 消费者应用 provider 提供的服务 Provider-common 公共类模块 rpc 架构 service-Registration 服务发现 nacos nacos配置中心 load-balancing 负载均衡 redis-trench 手写redis实现和链接 package com.trench.protocol;import com.trench.enumUtil.Redis…...
Unity动画桢事件
1,使用原因 在新项目内部审核的时候,说什么动画节奏不匹配,所以决定用动画桢事件来处理技能释放。当释放技能的时候,先播放技能动画,然后再动画桢所在的时间戳执行技能的逻辑。 2,具体实现 1,…...
搭建Redis集群
一 应用场景 为什么需要redis集群? 当主备复制场景,无法满足主机的单点故障时,需要引入集群配置。 一般数据库要处理的读请求远大于写请求 ,针对这种情况,我们优化数据库可以采用读写分离的策略。我们可以部 署一台…...
C语言sizeof 不是函数吗?
一、问题 sizeof 怎么⽤,它不是函数吗? 二、解答 sizeof 在 C 和 C 中不是一个函数,而是一个运算符。它在编译时计算其操作数所占用的内存大小,并返回一个大小(字节数),这个结果是类型或表达式…...
Mybatis的XML配置
MyBatis 是一个持久层框架,通过 XML 配置文件来定义 SQL 映射和结果的映射规则。以下是关于 MyBatis XML 配置文件的详细说明: 基本结构: XML 配置文件通常包含 <mapper>、<resultMap>、<typeAliases> 等元素。 2. mappe…...
Oracle报错:ORA-08002: sequence CURRVAL is not yet defined in this session
问题 直接查询序列的当前值,然后报了这个错误。 SELECT HR.EMPLOYEES_SEQ.CURRVAL; ORA-08002: sequence CURRVAL is not yet defined in this session解决 ORA-08002错误是Oracle数据库中的一个常见错误,它表示在当前会话中未定义序列的CURRVAL值。这…...
python10-Python的字符串之拼接字符串
如果直接将两个字符串紧挨着写在一起,Python就会自动拼接它们,例如如下代码。 s1 "软件测试划水老师傅,"软件测试老痞print(s1) 上面代码将会输出: 软件测试划水老师傅,软件测试老痞 上面这种写法只是书写字符串的一…...
衢州集团网站建设/青岛seo网站关键词优化
/*获得当前系统时间,插入到mysql数据库,数据库中的数据类型为datatime,对应于java.sql.Timestamp *时间格式为yyyy-MM-ddHH:mm:ss *pst.setTimestamp(4, new java.sql.Timestamp(new java.util.Date().getTime())); …...
营销型网站建设方案演讲ppt/百度手机助手应用商店下载
我们最常使用的应用,如淘宝、京东、抖音、微信等,全都是使用数据库来进行数据的存储。尤其是在接入互联网网民越来越多的情况下,业务系统经常会面临大量的数据请求,在一些大促场景,更会面临突然间的请求量剧增…...
页面好看的教育类网站模板/郴州网络推广外包公司
Sun 公司为其“开放 Solaris 项目”选择了“社区开发暨分发许可”(CDDL)方式,并将宣布立即向开发人员开放 DTrace 技术的源代码。但 Sun 公司计划保留 Solaris 的商标权以及与之相关的发行权,因此商业版 Solaris 软件将会继续存在…...
西安工程网站建设/西安百度竞价推广
Linux 6.0下DNS服务器搭建详细步骤,根据实验一步一步写的,绝对有用!下载地址转载于:https://blog.51cto.com/lihushan/895421...
北京网站优化wyhseo/网站排名怎么做上去
public class StaticInnerClassTest{ public static void main(String[] args){ double[] d new double[20]; for(int i 0;i < d.length;i) d[i] 100*Math.random(); ArrayAlg.Pair p ArrayAlg.minmax(d); System.out.…...
邯郸市建设局网站/网站关键词推广工具
2019独角兽企业重金招聘Python工程师标准>>> 过程简述: 1)服务器应用启动,建立相应的TCB,进入LISTEN状态; 2)客户端向服务器端发送一个TCP段,该段设置SYN标识,请求跟服务器端应用同步…...