博客主页:https://blog.csdn.net/wkd_007
博客内容:嵌入式开发、Linux、C语言、C++、数据结构、音视频
本文内容:介绍libjsoncpp 的编译和交叉编译
金句分享:你不能选择最好的,但最好的会来选择你——泰戈尔
本文未经允许,不得转发!!!
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.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
JSON是一种轻量级的数据交换格式。它可以表示数字、字符串、值的有序序列以及名称/值对的集合。
JsonCpp是一个C++库,允许操作JSON值,包括对字符串的序列化和反序列化。它还可以在非序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的方便格式。
JsonCpp 目前在 github 上托管。
官方网址:https://github.com/open-source-parsers/jsoncpp
但是连接github官网时,有时候会连接失败,可以到gitcode网址下载代码:
https://gitcode.com/mirrors/open-source-parsers/jsoncpp/tags
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)
,如果可以正常运行则不必理会该错误。
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
目录,里面就是编译结果。
libjsoncpp 的源文件其实就只有几个,分别在jsoncpp-1.9.5/include/
、jsoncpp-1.9.5/src/lib_json/*.cpp
,直接编译的方法就是将这些文件复制到一个空目录,使用aarch64-mix210-linux-g++
直接编译,步骤如下:
tar zxf jsoncpp-1.9.5.tar.gz
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
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/bash
echo "tar zxf jsoncpp-1.9.5.tar.gz"
tar zxf jsoncpp-1.9.5.tar.gz
echo "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进行交叉编译。
如果文章有帮助的话,点赞、收藏⭐,支持一波,谢谢