linux编译jsoncpp

jsoncpp简介:

        jsoncpp是一个 C++ 库,用于实现json格式的序列化和反序列化,完成多个数据对象组织成为json格式字符串,以及将json格式字符串解析成得到多个数据对象的数据。它还可以在反序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的方便格式。

github地址:

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

编译:

修改 CMakeLists.txt,将 JSONCPP_WITH_TESTS 配置成 OFF,不去编译测试工程

jsoncpp编译:

cd jsoncpp/
mkdir install     # 创建安装目录
mkdir build       # 创建编译目录
cd build
cmake -DCMAKE_INSTALL_PREFIX=../install ..
make -j4          # 开始编译
make install      # 安装到install

jsoncpp交叉编译:

创建一个 toolchain.cmake 文件:

# This is required. target system name
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR arm)
 
# specify the cross compiler
SET(TOOLCHAIN_PATH /opt/arm/opt/ext-toolchain/)
SET(CMAKE_SYSROOT ${TOOLCHAIN_PATH}/../../usr/arm-buildroot-linux-gnueabihf/sysroot)
SET(CMAKE_C_COMPILER   ${TOOLCHAIN_PATH}/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/bin/arm-linux-gnueabihf-g++)
 
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
 
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
cd jsoncpp/ 
mkdir install
mkdir build
cd build
# cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake -DCMAKE_INSTALL_PREFIX=../install ..
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake \
      -DCMAKE_INSTALL_PREFIX=../arm-install \
      -DJSONCPP_WITH_TESTS=OFF \  # 关闭测试(减少依赖)
      -DBUILD_SHARED_LIBS=OFF \   # 生成静态库(默认动态库)
      ..
make
make install

jsoncpp使用:

jsoncpp中含有三种基础类:Value、Write、Reader。

  1. Json::Value:用于存储键值对
  2. Json::Writer
    这个类负责将内存中的value对象转换为json文档,输出到文件或者字符串中
    它有两种主要的方法:FastWriter、StyledWriter
    FastWriter:快速无格式的将value转换成json文档
    StyledWriter:有格式的将value转换成json文档
  3. Json::Reader
    用于读取json文档,或者说是用于将字符串或者文件输入流转换为Json::Value对象

实用函数

  1. 判断某个键是否存在,bool Json::Value::isMember(const char *key) const;若存在则返回1,反之为0
  2. 判断某个键的类型,bool Json::Value::isString(const char *key) const;是则返回1,反之为0
  3. 得到Value中的所有键,Json::Value::getMemberBames() const;返回一个string类型的vector
  4. 删除某个键,Json::Value::removeMember(const char *key);返回删除的值或者null

测试demo

#include <iostream>
#include <fstream>
#include "json/json.h"

#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#elif defined(_MSC_VER)
#pragma warning(disable : 4996)
#endif

using namespace std;

int createjson()
{
    Json::Value root;
    Json::Value language;
    Json::Value mail;
    Json::StyledWriter writer;     # 格式化json串
    // Json::FastWriter writer;    # 压缩json串

    root["Name"] = "pikashu";
    root["Age"] = 18;

    language[0] = "C++";
    language[1] = "Python";
    root["Language"] = language;

    mail["QQ"] = "789123456@qq.com";
    mail["Google"] = "789123456@gmail.com";
    root["E-mail"] = mail;

    string json_file = writer.write(root);

    ofstream ofs;
    ofs.open("test1.json");
    if (!ofs.is_open())
    {
        cout << "open file error." << endl;
        return -1;
    }
    ofs << json_file;
    ofs.close(); 
    return 0;
}

int readjson()
{
    Json::Reader reader;
    Json::Value root;
    Json::Value language;
    Json::Value mail;

    ifstream ifs;
    ifs.open("test1.json");
    if (!ifs.is_open())
    {
        cout << "open file error." << endl;
        return -1;
    }

    if (!reader.parse(ifs, root))
    {
        cout << "parse error" << endl;
        return -1;
    }

    string Name = root["Name"].asString();
    int Age = root["Age"].asInt();  // jsoncpp中获取int类型数据
    cout << "Name: " << Name << endl;
    cout << "Age: " << Age << endl;

    if (root["language"].isArray())
    {
        Json::Value array_l = root["language"];
        cout << "Language: ";
        for (int i = 0; i < array_l.size(); i++)
        {
            cout << array_l[i] << " ";
        }
        cout << endl;
    }

    cout << "Google: " << root["E-mail"].get("Google", "").asString() << endl;
    cout << "QQ: " << root["E-mail"].get("QQ", "").asString() << endl;

    return 1;
}
int main()
{
    createjson();
    readjson();
    return 0;
}

参考:

交叉编译jsoncpp_jsoncpp交叉编译_蒋禾的博客-CSDN博客

https://www.cnblogs.com/nazhen/p/16800412.html

### Linux编译 C++ 库的安装配置与使用说明 在 Linux 系统上编译和使用 C++ 库通常涉及以下几个方面:安装必要的工具链、设置环境变量以及通过构建系统管理依赖关系。以下是关于如何在 Ubuntu 20.04 上完成这些操作的具体指导。 #### 工具链准备 为了能够成功编译 C++ 文件,需要先确保开发环境中已经安装了 GCC 或 Clang 编译器及相关工具链。可以通过 `apt` 包管理器快速安装基础组件: ```bash sudo apt update && sudo apt install build-essential cmake gcc g++ ``` 这一步会安装 GNU 的核心工具集,包括但不限于 `gcc`, `g++`, 和 `make`[^1]。 #### 配置 C++ 标准版本支持 现代 C++ 开发往往需要用到较新的标准特性 (如 C++11, C++14),因此建议显式指定目标标准来避免兼容性问题。例如,在终端中可以直接运行以下命令以启用对应的标准支持: ```bash g++ -std=c++11 -o output_file source_file.cpp g++ -std=c++14 -o output_file source_file.cpp ``` 如果经常切换不同版本,则可以考虑创建别名或者脚本来简化流程[^2]。 #### OpenGL 支持下的项目构建 对于图形处理领域内的应用来说,集成第三方库比如 FreeGLUT 是常见的需求之一。下面展示了一个基于 CMake 构建系统的例子,用于解决此类场景中的路径查找难题。 假设当前工作目录结构如下所示: ``` MyDemo/ ├── src/ │ └── main.cpp └── CMakeLists.txt ``` 我们需要额外定义一个辅助模块帮助定位 freeglut 头文件位置及其链接选项。具体做法是在项目的子目录 `build/CMakeModules/FindFREEGLUT.cmake` 中编写相关内容[^3]: ```cmake # FindFreeGLUT.cmake find_path(FREEGLUT_INCLUDE_DIR NAMES GL/freeglut.h) find_library(FREEGLUT_LIBRARY NAMES glut) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(FreeGLUT DEFAULT_MSG FREEGLUT_LIBRARY FREEGLUT_INCLUDE_DIR) mark_as_advanced(FREEGLUT_INCLUDE_DIR FREEGLUT_LIBRARY) set(FREEGLUT_LIBRARIES ${FREEGLUT_LIBRARY}) set(FREEGLUT_INCLUDE_DIRS ${FREEGLUT_INCLUDE_DIR}) ``` 随后修改根级 `CMakeLists.txt` 来引入上述自定义逻辑并声明最终可执行产物所需的参数: ```cmake cmake_minimum_required(VERSION 3.16) project(MyOpenGLProject LANGUAGES CXX) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/../build/CMakeModules") find_package(FreeGLUT REQUIRED) add_executable(${PROJECT_NAME} src/main.cpp) target_include_directories(${PROJECT_NAME} PRIVATE ${FREEGLUT_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} PRIVATE ${FREEGLUT_LIBRARIES}) set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 14) ``` 最后回到顶层调用常规方式生成 Makefile 并启动实际编译过程即可: ```bash mkdir -p build && cd build cmake .. make ./MyOpenGLProject ``` 以上步骤涵盖了从基本环境搭建到高级功能实现的整体思路,适用于大多数日常开发任务情境之中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值