libjsoncpp 的编译和交叉编译

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍libjsoncpp 的编译和交叉编译 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!

目录

  • 🎄一、编译环境
  • 🎄二、libjsoncpp的介绍和下载
    • ✨2.1 libjsoncpp的介绍
    • ✨2.2 libjsoncpp下载
  • 🎄三、编译
  • 🎄四、交叉编译
    • ✨4.1 cmake方式编译
    • ✨4.2 直接编译.h、.cpp
  • 🎄五、总结


在这里插入图片描述

🎄一、编译环境

  • Ubuntu 18.04

    $ uname -a
    Linux virtual-machine 5.4.0-84-generic #94~18.04.1-Ubuntu SMP Thu Aug 26 23:17:46 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
    
  • 交叉编译器:
    海思SS528使用的交叉编译器:aarch64-mix210-linux-g++,具体信息如下

    $ aarch64-mix210-linux-g++ -v
    Using built-in specs.
    COLLECT_GCC=aarch64-mix210-linux-g++
    COLLECT_LTO_WRAPPER=/opt/linux/x86-arm/aarch64-mix210-linux/host_bin/../libexec/gcc/aarch64-linux-gnu/7.3.0/lto-wrapper
    Target: aarch64-linux-gnu
    Configured with: /home/pub/software/toolchaines/build/aarch64-mix210-linux/../../open_source/aarch64-mix210-linux_src/gcc-7.3.0/configure --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --with-arch=armv8-a --prefix=/home/pub/software/toolchaines/build/aarch64-mix210-linux/aarch64_mix210_build_dir/aarch64_mix210 --enable-threads --disable-libmudflap -enable-libssp --enable-gold=yes --disable-libstdcxx-pch --disable-multilib --enable-multiarch --with-gnu-as --with-gnu-ld --enable-libgomp --enable-gnu-indirect-function --enable-checking=yes --enable-lto --enable-c99 --enable-long-long --disable-nls --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --enable-shared --with-pkgversion=20220321 --enable-languages=c,c++ --with-headers=/home/pub/software/toolchaines/build/aarch64-mix210-linux/aarch64_mix210_build_dir/aarch64_mix210/target/usr/include --with-sysroot=/home/pub/software/toolchaines/build/aarch64-mix210-linux/aarch64_mix210_build_dir/aarch64_mix210/target --with-build-sysroot=/home/pub/software/toolchaines/build/aarch64-mix210-linux/aarch64_mix210_build_dir/aarch64_mix210/target --with-gmp=/home/pub/software/toolchaines/build/aarch64-mix210-linux/aarch64_mix210_build_dir/obj/host-libs/usr --with-mpfr=/home/pub/software/toolchaines/build/aarch64-mix210-linux/aarch64_mix210_build_dir/obj/host-libs/usr --with-mpc=/home/pub/software/toolchaines/build/aarch64-mix210-linux/aarch64_mix210_build_dir/obj/host-libs/usr --with-build-time-tools=/home/pub/software/toolchaines/build/aarch64-mix210-linux/aarch64_mix210_build_dir/aarch64_mix210/aarch64-linux-gnu/bin --libdir=/home/pub/software/toolchaines/build/aarch64-mix210-linux/aarch64_mix210_build_dir/aarch64_mix210/lib --disable-bootstrap --with-system-zlib
    Thread model: posix
    gcc version 7.3.0 (20220321) 
    
  • cmake 版本
    我使用的这个cmake版本是 3.10.2 的,虽然 libcurl.so 好像有问题,但不影响编译。

    $ cmake --version
    cmake: /usr/local/lib/libcurl.so.4: no version information available (required by cmake)
    cmake version 3.10.2CMake suite maintained and supported by Kitware (kitware.com/cmake).
    

在这里插入图片描述

🎄二、libjsoncpp的介绍和下载

✨2.1 libjsoncpp的介绍

JSON是一种轻量级的数据交换格式。它可以表示数字、字符串、值的有序序列以及名称/值对的集合。

JsonCpp是一个C++库,允许操作JSON值,包括对字符串的序列化和反序列化。它还可以在非序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的方便格式。


✨2.2 libjsoncpp下载

JsonCpp 目前在 github 上托管。

官方网址:https://github.com/open-source-parsers/jsoncpp

但是连接github官网时,有时候会连接失败,可以到gitcode网址下载代码:
https://gitcode.com/mirrors/open-source-parsers/jsoncpp/tags

我下载的是,1.9.5 的版本:
在这里插入图片描述


在这里插入图片描述

🎄三、编译

  • 1、复制下载的jsoncpp-1.9.5.tar.gz到一个空目录,并解压

    tar zxf jsoncpp-1.9.5.tar.gz
    
  • 2、修改CMakeLists.txt,注释的第81行,如下

    #include(${CMAKE_CURRENT_SOURCE_DIR}/include/PreventInSourceBuilds.cmake)
    

    避免出现下面错误:

    CMake Error at include/PreventInSourceBuilds.cmake:41 (message):Quitting configuration
    Call Stack (most recent call first):include/PreventInSourceBuilds.cmake:45 (AssureOutOfSourceBuilds)CMakeLists.txt:81 (include)
    
  • 3、使用cmake运行下面命令

    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=`pwd`/result
    

    -DCMAKE_BUILD_TYPE=Release:表示构建的是发布版本;
    -DCMAKE_INSTALL_PREFIX=pwd/result:指定安装目录在当前目录的result目录。

    运行成功后,执行make && make install,执行成功就会在当前目录生成result目录,里面就是编译结果。

==注意:==执行过程会出现这个报错:/usr/bin/cmake: /usr/local/lib/libcurl.so.4: no version information available (required by /usr/bin/cmake),如果可以正常运行则不必理会该错误。

在这里插入图片描述

🎄四、交叉编译

✨4.1 cmake方式编译

  • 1、复制下载的jsoncpp-1.9.5.tar.gz到一个空目录,并解压

    tar zxf jsoncpp-1.9.5.tar.gz
    
  • 2、修改CMakeLists.txt,注释的第81行,如下

    #include(${CMAKE_CURRENT_SOURCE_DIR}/include/PreventInSourceBuilds.cmake)
    

    避免出现下面错误:

    CMake Error at include/PreventInSourceBuilds.cmake:41 (message):Quitting configuration
    Call Stack (most recent call first):include/PreventInSourceBuilds.cmake:45 (AssureOutOfSourceBuilds)CMakeLists.txt:81 (include)
    
  • 3、修改CMakeLists.txt,去掉jsoncpp的测试,因为交叉编译后的可执行文件,在Ubuntu运行会出错,直接不测试。
    将CMakeLists.txt的JSONCPP_WITH_TESTSON改为OFF

    option(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" ON)
    

    改为下面语句:

    option(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" OFF)
    
  • 4、使用cmake运行下面命令

    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=`pwd`/result_mix200 -DCMAKE_C_COMPILER=aarch64-mix210-linux-gcc -DCMAKE_CXX_COMPILER=aarch64-mix210-linux-g++
    

    -DCMAKE_BUILD_TYPE=Release:表示构建的是发布版本;
    -DCMAKE_INSTALL_PREFIX=pwd/result_mix200 :指定安装目录在当前目录的result目录。
    -DCMAKE_C_COMPILER=aarch64-mix210-linux-gcc:指定交叉编译工具
    -DCMAKE_CXX_COMPILER=aarch64-mix210-linux-g++:指定交叉编译工具

    运行成功后,执行make && make install,执行成功就会在当前目录生成result_mix200 目录,里面就是编译结果。

✨4.2 直接编译.h、.cpp

libjsoncpp 的源文件其实就只有几个,分别在jsoncpp-1.9.5/include/jsoncpp-1.9.5/src/lib_json/*.cpp,直接编译的方法就是将这些文件复制到一个空目录,使用aarch64-mix210-linux-g++直接编译,步骤如下:

  • 1、复制下载的jsoncpp-1.9.5.tar.gz到一个空目录,并解压
    tar zxf jsoncpp-1.9.5.tar.gz
    
  • 2、创建一个目录compile-jsoncpp-1.9.5,复制jsoncpp源文件到该目录
    mkdir compile-jsoncpp-1.9.5/
    cp jsoncpp-1.9.5/include/ jsoncpp-1.9.5/src/lib_json/* compile-jsoncpp-1.9.5/ -far
    
  • 3、进入compile-jsoncpp-1.9.5/目录,进行交叉编译
    cd compile-jsoncpp-1.9.5/
    aarch64-mix210-linux-g++ -shared -O3 -fPIC *.cpp -I include -o libjsoncpp.so.1.9.5
    

编译脚本如下:

#! /bin/bashecho "tar zxf jsoncpp-1.9.5.tar.gz"
tar zxf jsoncpp-1.9.5.tar.gzecho "mkdir compile-jsoncpp-1.9.5/"
mkdir compile-jsoncpp-1.9.5/
cp jsoncpp-1.9.5/include/ jsoncpp-1.9.5/src/lib_json/* compile-jsoncpp-1.9.5/ -far
cd compile-jsoncpp-1.9.5/echo "compiling jsoncpp-1.9.5"
aarch64-mix210-linux-g++ -shared -O3 -fPIC *.cpp -I include -o libjsoncpp.so.1.9.5

在这里插入图片描述

🎄五、总结

👉本文介绍了jsoncpp的下载和编译,分别使用了cmake和直接编译的方法对jsoncpp进行交叉编译。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

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

相关文章

开通商家转账到零钱技巧

商家转账到零钱是什么? 通过商家转账到零钱这个功能,如果我们系统需要对用户支付费用,比如发放佣金、提成、退款之类的,可以直接转账到用户的微信零钱。 【商家转账到零钱】是【企业付款到零钱】的升级版,2022年5月1…

H264解码原理详解

H.264的编码原理参考文章H.264的编码原理 解码原理 解码器负责将符合H.264码流规范的压缩视频流解码,并进行图像重建。 根据如下图所示的解码器流图,我们可以看出基本的解码流程如下:解码器从网络提取层中接收压缩的比特流,经过…

Mysql复习1--理论基础+操作实践--更新中

Mysql 索引索引的分类索引失效sql优化 删除数据库数据恢复 索引InnoDB引擎MyISAM引擎Memory引擎Btree索引支持支持支持hash索引不支持不支持支持R-tree索引不支持支持不支持Full-text索引5.6版本以后支持支持不支持 索引 解释说明: 索引指的是帮助mysql高效的获取数据的结构叫…

《Windows核心编程》若干知识点实战应用分享

目录 1、进程的虚拟内存分区与小于0x10000的小地址内存区 1.1、进程的虚拟内存分区 1.2、小于0x10000的小地址内存区 2、保存线程上下文的CONTEXT结构体 3、从汇编代码角度去理解多线程运行过程的典型实例 4、调用TerminateThread强制结束线程会导致线程中的资源没有释放…

Redisson 分布式锁可重入的原理

目录 1. 使用 Redis 实现分布式锁存在的问题 2. Redisson 的分布式锁解决不可重入问题的原理 1. 使用 Redis 实现分布式锁存在的问题 不可重入:同一个线程无法两次 / 多次获取锁举例 method1 执行需要获取锁method2 执行也需要(同一把)锁如…

Python map函数

在Python编程中,map()函数是一个强大的工具,用于将函数应用于可迭代对象(如列表、元组等)的每个元素,然后返回一个新的可迭代对象,其中包含应用函数后的结果。本文将深入探讨map()函数的用法,提…

云计算项目五:部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务

部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务 案例1:配置逻辑卷步骤一:创建LV步骤二:格式化案例2:配置数据库服务器步骤一:安装软件MySQL服务软件(2台数据库服务器都要安装)步骤二:挂载lv设备步骤三:启动服务步骤四:管理员登录案例3:配置主从同步步骤一…

linuxshell日常脚本命令之if判断

shell脚本if中判断大于、小于、等于、不等于的符号 脚本有问题,有没有哪位大佬能帮忙检查一下? #!/bin/bash#run_num$(squeue | grep shifting | wc -l) run_numsqueue | grep shifting | wc -l #run_num$(squeue | grep shifting | wc -l 2>&1…

vue+draggable+el-upload上传图片拖拽重排方法

vuedraggableel-upload上传图片拖拽重排方法 1.html <el-row><el-col><el-form-item label"添加视频/图片" prop"device_id"><div class"image-upload"><draggable v-model"fileList" update"dataDr…

js树形控件zTree使用总结

文章目录 一、zTree简介1.1、zTree的特点1.2、zTree文件介绍 二、zTree的基本使用2.1、zTree的创建2.2、zTree的配置2.3、zTree的数据格式2.3.1、标准数据格式2.3.2、简单数据格式 2.4、zTree的常用方法2.4.1、获取zTree对象2.4.2、增加节点2.4.3、勾选或取消勾选全部节点2.4.4…

视频汇聚/云存储平台EasyCVR级联上级播放后一直发流是什么原因?

可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时…

【Web前端实操12】将一个100*100的盒子,变成圆形

将一个100*100的盒子&#xff0c;变成圆形&#xff0c;是一个简单的实操&#xff0c;想要完成这个实操&#xff0c;最关键的是一个知识点&#xff0c;使用 CSS3 border-radius 属性&#xff0c;你可以给任何元素制作 "圆角" border-radius 属性&#xff0c;可以使用…

软考复习之软件工程篇

软件生命周期 问题定义&#xff1a;要示系统分析员与用户进行交流&#xff0c;弄清”用户需要计算机解决什么问题”然后提出关于“系统目标与范围的说明”&#xff0c;提交用户审查和确认 可行性研究&#xff1a;一方面在于把待开发的系统的目标以明确的语言描述出来&#xf…

【Linux】shell外壳和权限

文章目录 shell外壳用户切换权限 shell外壳 什么是shell外壳呢&#xff1f;首先我们应该知道&#xff0c;用户和操作系统内核是不能直接接触的&#xff0c;因为首先操作系统本身就很难去操作&#xff0c;另一方面也是为了操作系统安全考虑&#xff0c;不能让用户直接去操作内核…

JeecgBoot 3.6.1实现Modal对话框,以为审核数据为例

JeecgBoot 3.6.1实现Modal对话框 vue使用的是3.0版本 文章目录 JeecgBoot 3.6.1实现Modal对话框前言一、列表页面关键代码示例二、textAuditModal.vue代码示例三、test.api.ts总结 前言 在工作中&#xff0c;有一个需求&#xff0c;要求&#xff0c;在数据列表页&#xff0c;…

SUBMIT指定用户名错误

1、SUBMIT说明 在ABAP中&#xff0c;SUBMIT关键字用于运行另一个ABAP程序。通过SUBMIT关键字&#xff0c;可以在当前程序内部调用其他程序&#xff0c;而无需关闭当前程序。 SUBMIT语句的一般语法如下&#xff1a; "--------------------斌将军-------------------- SUB…

Java接收curl发出的中文请求无法解析

最近做项目遇到了这种情况&#xff0c;Java接收curl发出的中文请求无法解析&#xff0c;英文请求一切正常&#xff0c;中文请求则对方服务器无法解析&#xff0c;可以猜测是中文导致的编码问题&#xff0c;但是奇怪的是&#xff0c;本地输出json也没有乱码&#xff0c;编解码正…

leetcode:三数之和---双指针

问题&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

bean的一生

你曾读spring源码 “不知所云”、“绞尽脑汁”、“不知所措”嘛&#x1f923;&#x1f923;&#x1f923; 那这篇文章可能会对你有所帮助&#xff0c;小编尝试用简单、易懂的例子来模拟spring经典代码&#x1f449;Spring Bean生命周期及扩展点&#xff0c; 让你能够****轻松…

Linux系统Shell脚本编程之条件语句

一、条件测试 Shell 环境根据命令执行后的返回状态值 " $? " 来判断是否执行成功&#xff0c;当返回值为0时表示成功&#xff0c;否则表示失败或异常&#xff08;非0值&#xff09;。使用专门的测试工具 test 命令&#xff0c;可以对特定条件进行测试&#xff0c;并…