JsonCpp库学习记录

使用源码的方式

到JsonCpp的开源库仓库下载最新的发行版本

解压压缩包

使用Python生成源码文件

在本路径下cmd打开控制台,使用python编译(前提是python环境已安装)

python amalgamate.py

生成dist文件夹

jsoncpp为整合在一起的源码,可以直接放到项目中用

新建jsoncpp源码测试项目JsonCppDemo,在项目目录下新建文件夹jsonsrc

把上面编译出来的文件放到该文件夹下

在VS中右键添加现有项

把头文件和源码放进去项目中

在main函数中引入json.h头文件,使用以下的demo代码进行验证

int main()

{

    std::cout << "Hello JsonCpp!\n";

    // 创建Json对象

    Json::Value root;

    // 创建一个Json解析器

    Json::Reader reader;

    // 需要被转换的Json字符串

    std::string test = "{\"name\" : \"Adam\", \"age\" : 20, \"isMarried\" : false}";

    // 将Json字符串转换为Json对象

    bool parsingSuccessful = reader.parse(test, root);

    if (!parsingSuccessful) {

        // 如果转换失败,报告错误

        std::cout << "Failed to parse JSON : " << reader.getFormattedErrorMessages();

        return 1;

    }

    // 输出转换后的Json对象

    std::cout << "Name: " << root["name"].asString() << "\n";

    std::cout << "Age: " << root["age"].asInt() << "\n";

    std::cout << "isMarried: " << (root["isMarried"].asBool() ? "true" : "false") << "\n";

    return 0;

}

成功执行

使用静态库或者动态库的方式

使用CMake生成解决方案

在文件夹路径下cmd打开控制台,使用CMake(CMake环境已安装)生成VS编译器的解决方案,执行以下命令:

cmake -S . -B build -G "Visual Studio 16 2019" 其中,-S . 表示源码在当前目录,-B build表示生成的文件放在当前目录下的build子文件夹中,-G "Visual Studio 16 2019"表示生成适用于2019版的VS 16的解决方案。

最后会在当前目录生成一个build文件夹,进入该文件夹

使用VS 2019打开jsoncpp.sln解决方案

其中有两个工程负责生成lib库

jsoncpp_static工程是负责生成静态lib库文件,jsoncpp_lib工程主要负责生成dll库文件

首先我们来编译生成json

生成静态lib库

鼠标选到jsoncpp_static工程,解决方案配置选release,解决方案平台选x64(根据自己的引用工程进行配置)

右键选择重新生成

从生成的信息中找到生成的静态库lib

使用VS新建静态库测试工程JsonCppStaticLib,把jsoncpp-1.9.5工程下的include文件夹移到JsonCppStaticLib项目的文件夹下

同时在JsonCppStaticLib项目下新建lib文件夹

把上面在jsoncpp编译出来的静态文件放到\lib\x64\release路径下

最好通过路径命名来区别不同编译环境下编译出来的库

右键项目属性,打开"C/C++" -> “常规”,然后在“附加包含目录”中加入头文件所在路徑。

在链接器选项里设置。在"链接器" -> "常规"部分的"附加库目录"填写.lib文件所在的目录。

选择"链接器" -> “输入”,然后在"附加依赖项"那里添加.lib文件

完成后继续使用上面的例子,引入json.h文件,重新编译运行

生成动态dll库

鼠标选到jsoncpp_li工程,解决方案配置选release,解决方案平台选x64(根据自己的引用工程进行配置)

右键重新生成解决方案

可以看到一共生成3个文件jsoncpp.exp,jsoncpp.lib和jsoncpp.dll

.exp文件是导出文件,主要用于动态链接库(DLL)的创建过程中。在创建DLL时,会生成一个.exp文件和一个.lib文件。.exp文件包含了DLL中所有导出函数的信息,而.lib文件是一个导入库文件,用于在编译时链接到对应的DLL; 如果应用程序需要使用DLL中的函数或变量,那么就需要在构建应用程序时链接该.lib文件,然后在运行时,应用程序通过在.exp文件中找到的导出信息,来加载和使用DLL。

可以看得出来,静态库生成的lib比动态库生成的lib大的多

使用VS新建静态库测试工程JsonCppLib,把jsoncpp-1.9.5工程下的include文件夹移到JsonCppLib项目的文件夹下

按照添加静态库的方式

同时在JsonCppLib项目下新建lib文件夹

把上面在jsoncpp编译出来的静态文件放到\lib\x64\release路径下

最好通过路径命名来区别不同编译环境下编译出来的库

右键项目属性,打开"C/C++" -> “常规”,然后在“附加包含目录”中加入头文件所在路徑。

在链接器选项里设置。在"链接器" -> "常规"部分的"附加库目录"填写.lib文件所在的目录。

选择"链接器" -> “输入”,然后在"附加依赖项"那里添加.lib文件

完成后继续使用上面的例子,引入json.h文件,重新编译运行

提示程序运行时缺少dll文件,我们找到生成的可执行文件的位置,把编译出来的dll文件放到同一个文件夹中

这次重新运行

执行成功

问题注意

刚开始编译时出现了编译失败的报错

出现这个问题的原因是项目使用了debug模型,但是jsoncpp_static.lib又是在release下编译出来的,所以用到的项目解决方案配置和平台要保持一致

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

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

相关文章

数通自学——VLAN虚拟局域网,eNSP实验讲解

VLAN虚拟局域网&#xff0c;eNSP实验讲解 一、概念二、eNSP仿真实验1、实验一&#xff1a;vlan演示&#xff08;交换机端口access模式&#xff09;2、实验二&#xff1a;vlan演示&#xff08;交换机端口trunk模式&#xff09; 一、概念 VLAN&#xff08;Virtual Local Area Ne…

vmware运维技巧总结

vmware使用实践总结 技巧一、在线添加硬盘技巧二、lvm脚本挂载硬盘 技巧一、在线添加硬盘 适用于不重启vmware虚拟机添加硬盘 首先控制台新加一块100G的硬盘 此时虚拟机内部是识别不到的&#xff0c;lsblk查看如下 不重启的情况下&#xff0c;采用如下方案 步骤一、查找主机…

智慧港口大屏可视化产品原型设计

全球贸易的快速发展和技术的不断进步&#xff0c;港口作为国际贸易的重要枢纽&#xff0c;其运营效率和管理水平直接影响到全球供应链的顺畅。智慧港口的概念应运而生&#xff0c;旨在通过新一代信息技术&#xff0c;将港口相关业务和管理创新深度融合&#xff0c;实现港口的高…

使用 Qt GRPC 构建高效的 Trojan-Go 客户端:详细指南

使用 Qt GRPC 构建高效的 Trojan-Go 客户端&#xff1a;详细指南 初识 Qt 和 gRPC 什么是 Qt&#xff1f;什么是 gRPC&#xff1f; 项目结构概述创建 proto 文件定义 API 下载 api.proto 文件解析 proto 文件 1. package 与 option 语句2. 消息类型定义 TrafficSpeedUserUserSt…

利用Django实现MySQL数据库的内容在网页的增删改写

利用Django实现MySQL数据库的内容在网页的增删改写 1.建立项目2.定义模型3.创建视图4.创建模板5.创建表单和配置url6.最后修改7.效果 1.建立项目 输入命令django-admin startproject aaa 新建项目&#xff0c;项目名称命名为aaa&#xff0c;打开aaa文件夹&#xff0c;命令提示…

vscode 安装教程

双击vscode 安装包 同意&#xff0c;下一步 可以使用默认安装路径&#xff0c;也可以优化为这个 全选 取消勾选&#xff0c;点完成 在桌面创建一个空文件夹&#xff0c;拖动到vscode图标上 点击这个图标创建文件&#xff0c;注意必须以.py 结尾&#xff01;&#xff0…

第三十二篇:TCP协议粘包和滑动窗口,TCP系列七

上一篇《第三十一篇&#xff1a;TCP协议如何解决丢包的问题&#xff0c;TCP系列六》讲了TCP如何解决丢包问题&#xff0c;本文将为大家讲解TCP是如何提高传输效率&#xff0c;减少传输时延的原理。 1. TCP是如何提高传输效率&#xff0c;减少传输时延的 ① 粘包 如果传输的数…

下载数据集用于图像分类并自动分为训练集和测试集方法

一、背景 最近需要用Vision Transformer&#xff08;ViT&#xff09;完成图像分类任务&#xff0c;因此查到了WZMIAOMIAO的GitHub&#xff0c;里面有各种图像处理的方法。而图像处理的前期工作就是获取大量的数据集&#xff0c;用于训练模型参数&#xff0c;以准确识别或分类我…

国标GB28181视频平台EasyGBS国标GB28181软件实现无需插件的视频监控对讲和网页直播

在当今社会&#xff0c;视频监控已经成为公共安全、企业管理、智能城市建设等领域不可或缺的一部分。然而&#xff0c;由于不同厂家和平台之间的兼容性问题&#xff0c;视频监控系统的联网和整合面临巨大挑战。为了解决这个问题&#xff0c;国家制定了《公共安全视频监控联网系…

LabVIEW非接触式模态参数识别系统开发

基于LabVIEW的模态参数识别系统采用非接触式声学方法&#xff0c;结合LabVIEW软件和高精度硬件&#xff0c;实现机械结构模态参数的快速准确识别。降低了模态分析技术门槛&#xff0c;提高测试效率和准确性。 项目背景与意义: 传统的模态分析方法&#xff0c;如锤击法&#x…

一个简单的图像分类项目(六)编写脚本:初步训练

训练的脚本 &#xff0c;用于训练和测试。lib.train.py: import timefrom load_imags import train_loader, train_num from nets import *def main():# 定义网络print(Please choose a network:)print(1. ResNet18)print(2. VGG)# 选择网络while True:net_choose input()if…

【C++】How the C++ Compiler Works

Firstly it needs to pre-process our code which means that any pre-processor statements get evaluated and once our code has been pre-processed we move on to more or less tokenizing(记号化) and parsing(解析) and basically sorting out(整理) this English C lan…

第2次CCF CSP认证真题解

1、相邻数对 题目链接&#xff1a;https://sim.csp.thusaac.com/contest/2/problem/0 本题和第1次认证的第1题“相反数”差不多&#xff0c;都是考察循环遍历比较和计数。 100分代码&#xff1a; #include <iostream> using namespace std; int main(int argc, char …

一款强大的开源OCR工具,支持90+语言识别

大家好&#xff0c;今天给大家分享一款功能强大的开源光学字符识别&#xff08;OCR&#xff09;工具Surya OCR&#xff0c;它基于先进的深度学习技术&#xff0c;提供了高效的字符识别能力&#xff0c;并支持多种语言的文本检测与识别。 项目介绍 核心功能 1.多语言支持 Sur…

破局:DLinear

1. Introduction (1) time series forecasting (TSF)&#xff1b; (2) 回顾 “ Transformer (Vaswani et al. 2017) ” 的各领域优秀表现&#xff1a; (3) IMS vs. DMS : → Consequently, IMS forecasting is preferable when there is a highly-accurate single-step fore…

量化交易打怪升级全攻略

上钟&#xff01; 继续分享量化干货~ 这次要唠的是Stat Arb的新作《Quant Roadmap》(中译名《量化交易路线图》)&#xff0c;为了方便&#xff0c;下文就称呼作者为“老S”&#xff0c;根据公开资料显示&#xff0c;他可是正儿八经的的量化研究员出身&#xff0c;在漂亮国头部对…

【electron8】electron实现“图片”的另存为

注&#xff1a;该列出的代码&#xff0c;都在文章内示例出 1. 另存为按钮事件&#xff1a; const saveAsHandler async () > {const { path, sessionId } recordInfoif(typeof message ! string) return;// 因为我的图片是加密的&#xff0c;所以我需要根据接口返回的路…

全国智能手机使用数据集-dta格式(包含2015、2017、2019三个版本)

数据简介&#xff1a;为推动经济社会高质量发展&#xff0c;缓解经济下行压力&#xff0c;中国加大推动5G基建、大数据中心等科技领域基础设施的建设和完善。数字技术深入各行各业&#xff0c;催生了新业态、新模式、新机会和新就业形式。智能手机作为劳动者使用数字技术的重要…

二叉树的存储方式和遍历方式

文章目录 二叉树的存储方式二叉树的遍历方式DFS--递归遍历DFS--迭代遍历BFS--层次遍历 LC102 二叉树的存储方式 链式存储&#xff08;指针&#xff09;或 顺序存储&#xff08;数组&#xff09; (1)链式存储&#xff1a;通过指针把分布在各个地址的节点串联一起。 (2)顺序存储…

docker上传离线镜像包到Artifactory

docker上传离线镜像包到Artifactory 原创 大阳 北京晓数神州科技有限公司 2024年10月25日 17:33 北京 随着docker官方源的封禁&#xff0c;最近国内资源也出现无法拉取的问题&#xff0c;Artifactory在生产环境中&#xff0c;很少挂外网代理去官方源拉取&#xff0c;小编提供…