当前位置: 首页 > wzjs >正文

潍坊学网站建设最新域名备案查询

潍坊学网站建设,最新域名备案查询,插件 wordpress,企业网站模板专业网前言 本篇为持续更新状态,内容包含window、Linux下打动态库包,以及引入动态库包的方式。 一、window 1、动态库打包 以百度的OCR接口调用打dll库为例,以下为qtcreator创建动态库过程: 1.1Qtcreator创建lib项目 创建成功后&…

前言

        本篇为持续更新状态,内容包含window、Linux下打动态库包,以及引入动态库包的方式。

一、window

1、动态库打包

以百度的OCR接口调用打dll库为例,以下为qtcreator创建动态库过程:

1.1Qtcreator创建lib项目

创建成功后,即包含以下5个文件,其中baiduocrlib.h和baiduocrlib.cpp是生成动态库文件的主要文件,baiduocrlib_global.h是引入baiduocrlib动态库时,必须包含的文件(在引入动态库时详细介绍)。

1.2修改动态库输出目录

动态库是通过“构建”生成的,不能“运行”生成,在.pro文件中,加入一行

#在baiduocrlib.cpp的同级目录,创建一个dll目录,生成的动态库将存在此目录下
DESTDIR = ../dll

点击左下角的“锤子”进行项目构建,即可在dll下看到生成的动态库文件,如下图所示

1.3编写动态库内容

与常规编写的类是一样,即在头文件中定义,在cpp文件中定义,头文件baiduocrlib.h内容如下


#ifndef BAIDUOCRLIB_H
#define BAIDUOCRLIB_H#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QEventLoop>
#include <QUrl>
#include <QUrlQuery>
#include <QJsonDocument>
#include <QJsonObject>
#include <QObject>
#include <QDebug>
#include <QFile>
#include <QImage>
#include <QBuffer>
#include <QtCore/qglobal.h>#if defined(BAIDUOCRLIB_LIBRARY)
#  define BAIDUOCRLIB_EXPORT Q_DECL_EXPORT
#else
#  define BAIDUOCRLIB_EXPORT Q_DECL_IMPORT
#endifclass BAIDUOCRLIB_EXPORT Baiduocrlib
{
public:Baiduocrlib();QByteArray  block_post_data(const QNetworkRequest& request,const QUrlQuery& postData);QString get_access_token(const QString& client_id,const QString& client_secret) ;QByteArray get_ocr_data_by_png(const QString& access_token,const QString& img_base64_content);QByteArray get_ocr_data_by_pdf(const QString& access_token,const QString& pdf_base64_content);int get_pdf_urlcontent(const QString& pdfFilePath,QString& urlEncodedString);int  get_img_urlcontent(const QString& imagePath,QString& urlEncodedString);
};#endif // BAIDUOCRLIB_H

cpp文件baiduocrlib.cpp内容如下

#include "baiduocrlib.h"Baiduocrlib::Baiduocrlib()
{
}QString Baiduocrlib::get_access_token(const QString& client_id,const QString& client_secret) {QString access_token;QUrl url("https://aip.baidubce.com/oauth/2.0/token");QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");request.setRawHeader("Accept", "application/json");// 创建 POST 数据QUrlQuery postData;postData.addQueryItem("grant_type", "client_credentials");postData.addQueryItem("client_id", client_id);postData.addQueryItem("client_secret", client_secret);//发送Post包(通过阻塞方式获取返回结果)QByteArray jsonData=block_post_data(request,postData);// 解析 JSON 数据QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);if (jsonDoc.isNull()) {qDebug() << "Failed to create JSON doc.";return "";}// 检查 JSON 文档类型if (jsonDoc.isObject()) {QJsonObject jsonObj = jsonDoc.object();//qDebug() << "JSON Object:" << jsonObj;// 访问 JSON 对象中的数据if (jsonObj.contains("access_token")) {access_token = jsonObj["access_token"].toString();qDebug() << "access_token:" << access_token;}} else {qDebug() << "JSON is not an object.";}return access_token;
}QByteArray Baiduocrlib::block_post_data(const QNetworkRequest& request,const QUrlQuery& postData){//QString resstr;QByteArray responseData;// 创建网络访问管理器QNetworkAccessManager block_manager;// 发送POST请求QNetworkReply* reply = block_manager.post(request, postData.toString(QUrl::FullyEncoded).toUtf8());// 创建一个事件循环来阻塞当前线程QEventLoop loop;QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);// 阻塞当前线程直到网络请求完成loop.exec();// 检查请求结果if (reply->error() == QNetworkReply::NoError) {// 请求成功,处理返回的数据/*QByteArray */responseData = reply->readAll();//resstr = QString::fromUtf8(responseData);//qDebug() << __LINE__ <<"Response:" << resstr;} else {// 请求失败,处理错误qDebug() << "Error:" << reply->errorString();responseData="";}// 清理reply->deleteLater();return responseData;
}QByteArray Baiduocrlib::get_ocr_data_by_png(const QString& access_token,const QString& img_base64_content){//QString urlstr=QString("https://aip.baidubce.com/rest/2.0/ocr/v1/general?access_token=%1").arg(access_token);//标准含位置版本QString urlstr=QString("https://aip.baidubce.com/rest/2.0/ocr/v1/accurate?access_token=%1").arg(access_token);//高精度含位置版本QUrl url(urlstr);QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");request.setRawHeader("Accept", "application/json");// 创建 POST 数据QUrlQuery postData;postData.addQueryItem("image", img_base64_content);postData.addQueryItem("detect_direction", "false");postData.addQueryItem("paragraph", "false");postData.addQueryItem("probability", "false");postData.addQueryItem("multidirectional_recognize", "false");//发送Post包(通过阻塞方式获取返回结果)QByteArray jsonData=block_post_data(request,postData);//qDebug() << __LINE__ <<"jsonData:" << jsonData;return jsonData;
}QByteArray Baiduocrlib::get_ocr_data_by_pdf(const QString& access_token,const QString& pdf_base64_content){qDebug() << __LINE__ << __FUNCTION__;//QString urlstr=QString("https://aip.baidubce.com/rest/2.0/ocr/v1/general?access_token=%1").arg(access_token);//标准含位置版本QString urlstr=QString("https://aip.baidubce.com/rest/2.0/ocr/v1/accurate?access_token=%1").arg(access_token);//高精度含位置版本QUrl url(urlstr);QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");request.setRawHeader("Accept", "application/json");// 创建 POST 数据QUrlQuery postData;postData.addQueryItem("pdf_file", pdf_base64_content);postData.addQueryItem("detect_direction", "false");postData.addQueryItem("paragraph", "false");postData.addQueryItem("probability", "false");postData.addQueryItem("multidirectional_recognize", "false");//发送Post包(通过阻塞方式获取返回结果)QByteArray jsonData=block_post_data(request,postData);//qDebug() << __LINE__ <<"jsonData:" << jsonData;return jsonData;
}int Baiduocrlib::get_pdf_urlcontent(const QString& pdfFilePath,QString& urlEncodedString){// 读取 PDF 文件QFile file(pdfFilePath);if (!file.open(QIODevice::ReadOnly)) {qDebug() << "无法打开文件:" << pdfFilePath;return -1;}QByteArray pdfData = file.readAll();file.close();// Base64 编码QByteArray base64Encoded = pdfData.toBase64();// URL 编码urlEncodedString = QUrl::toPercentEncoding(base64Encoded);return 0;
}int Baiduocrlib::get_img_urlcontent(const QString& imagePath,QString& urlEncodedString){// 加载图片QImage image(imagePath);if (image.isNull()) {qDebug() << "无法加载图片:" << imagePath;return -1;}// 将图片保存到QByteArray中QByteArray byteArray;QBuffer buffer(&byteArray);buffer.open(QIODevice::WriteOnly);// 将图片保存为PNG格式,你也可以选择其他格式如JPEGif (!image.save(&buffer, "PNG")) {qDebug() << "无法将图片保存到缓冲区";return -1;}buffer.close();// 将二进制数据转换为Base64编码QByteArray base64Data = byteArray.toBase64();// 转换为QStringQString base64String = QString::fromLatin1(base64Data);// URL编码urlEncodedString = QUrl::toPercentEncoding(base64String);qDebug() << __LINE__ << urlEncodedString.size();return 0;
}

1.4生成的动态库

以上内容进行构建之后,在dll目录下将会看到两个文件Baiduocrlib.dll和libBaiduocrlib.a

主要是使用xxx.dll文件,引用前最好把头文件也放在同一个目录下(别的项目引用此动态库时,需要引用到这个头文件)。

2、动态库引入

上面生成了两个文件:dll和.a(mingw32编译器生成的动态库),其他项目引入时,只需要其中一个动态库文件

1、在.pro文件中加入以下示例内容

#创建lib目录,把commdll.dll文件和commdll.h文件放到lib目录下HEADERS += \lib/commdll.h \            #增加头文件,通过头文件来引用mainwindow.h
LIBS +=-L$$PWD/lib -lcommdll   # $$PWD表示当前路径

然后在mainwindow.h文件中加入#include "lib/commdll.h"即可,调用时,按照常规类的方式来调用,可以理解为dll文件封装了自定义类。

Linux

1、动态库打包

linux下Qtcreator生成动态库的操作方法与window是一样的,区别是Linux下生成的是so文件

2、动态库引入

除了window中直接修改.pro文件,也可以在qtcreator中添加库,如下所示:

2.1右键点击左上角的项目,选中右键菜单【添加库】

2.2 选中【外部库】,点击下一步

2.3

2.3 选择library type类型为【Linux(lib*.so,lib*.a)】,选择库文件和路径,点击下一步

2.4点击完成即可

在pro文件中,可看到如下信息,还缺动态库的头文件,在HEADERS中加上动态库的头文件即可

结尾

        QT打包的动态库SO包,后台g++编译的程序不一定能调用,受g++版本,以及QT的依赖库等因素的影响。如果一个SO包既要同时支持g++编译的程序和QT程序调用,可以用传统C/C++的打包方式【Linux C/C++开发】编译及引用so动态库。


文章转载自:

http://mPLX49Ja.dLmqn.cn
http://yBhhyC1u.dLmqn.cn
http://X4O7eTVE.dLmqn.cn
http://UcCQnFMk.dLmqn.cn
http://Z8EadJEf.dLmqn.cn
http://IR4nLMCR.dLmqn.cn
http://48IxvyOL.dLmqn.cn
http://caYs9rSN.dLmqn.cn
http://XfplLKRU.dLmqn.cn
http://pfkXZVjM.dLmqn.cn
http://ztxg8X3S.dLmqn.cn
http://fpJEZTcC.dLmqn.cn
http://I1z2DuFR.dLmqn.cn
http://TwcZPg7g.dLmqn.cn
http://zBHmxsBv.dLmqn.cn
http://t16f0zXl.dLmqn.cn
http://TYepMHQl.dLmqn.cn
http://a9vkqd9A.dLmqn.cn
http://DdypnpYm.dLmqn.cn
http://2e1JzOTz.dLmqn.cn
http://E1UlCveu.dLmqn.cn
http://8pll2dIy.dLmqn.cn
http://0tDGp6AG.dLmqn.cn
http://bZrtK3Jl.dLmqn.cn
http://3JeAw57B.dLmqn.cn
http://2ssOBfp7.dLmqn.cn
http://AqxFdFvg.dLmqn.cn
http://6PKvl10Y.dLmqn.cn
http://26uOnerw.dLmqn.cn
http://vGMPw0DI.dLmqn.cn
http://www.dtcms.com/wzjs/761787.html

相关文章:

  • html5 做网站淮滨网站建设
  • 网站页头页尾怎样做外发加工费用会计处理
  • 购物网站宣传方案网站开发的经费预算
  • 做网站番禺网络推广项目代理
  • 关于政协 网站建设四川省住建厅特种作业资格证
  • 内蒙和城乡建设部网站网页游戏网站哪个最好
  • 网站改版公司一台虚拟主机能建设几个网站
  • 美食网站建设规划书需求分析兰州装修公司
  • 建网站那个网最好文化建设方面的建议
  • 徐州网站排名公司哪家好开发网站访问流量赚钱
  • 做衣服 网站love域名做的网站
  • 上海华亮建设集团网站wordpress分站点
  • 中国交通建设网官方网站高端网站建设内容
  • 网站地图有哪些网址wordpress写文章怎么加媒体
  • 个人网站备案需要哪些资料网站正在备案中模板
  • 开周边网站怎么做品牌青岛seo网站管理
  • 企业网站手机端wordpress打教程
  • 苏州外贸网站建设东营网格通app怎么下载
  • 强的网站建设公司排名WordPress加入百度地图
  • 大连网站怎么推广微网站建设哪家便宜
  • 文章收录网站网站上传大马后怎么做
  • 公司手机网站效果图58同城类型网站制作
  • 视频聚合网站怎么做不侵权城市更新论坛破圈
  • 域名的种类及查询网站站点搭建
  • 怎样打死网站wordpress调用 php文件
  • 营销型网站制作企业风险地区查询最新
  • 南京教育网站开发昆明软件开发公司
  • 做网站有什么类型西安市高陵区建设局网站
  • 中国十大购物网站排行榜网站漏洞扫描工具
  • 交网站建设 域名计入什么科目郑州网站建设咨询