😁博客主页😁:🚀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_TESTS
的ON
改为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进行交叉编译。
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁