• Linux中jsoncpp的编译使用


    旧版jsoncpp编译

    1、预备条件:

    1. JsonCPP类库http://sourceforge.net/projects/jsoncpp/?source=dlp
    2. SCONS编译器http://sourceforge.net/projects/scons/?source=dlp
    3. Pythonhttp://www.python.org/

    JsonCPP类库需要Scons编译器来编译,而Scons需要Python安装了才能使用。具体安装步骤请参见文件夹下的ReadMe文件。

    2、

    安装scons:

    sudo apt-get install scons

    解包jsoncpp:

    tar -zxf jsoncpp-src-0.5.0.tar.gz

    jsoncpp安装:

    解包后进入其目录。输入以下命令:

    scons platform=linux-gcc 就会安装成功

    3、

    上述已经完成jsoncpp的编译,在解压目录jsoncpp-src-0.5.0/libs/linux-gcc-7/下可以看到生成了两个文件:

    1. libjson_linux-gcc-7_libmt.a
    2. libjson_linux-gcc-7_libmt.so

    把.a 和.so 文件拷贝到/usrl/lib 目录下(参考了不同资料,说法并不统一,有的是拷贝到/lib下,有的则是/usr/local/lib),可以为了方便编译给它改个名字libjsoncpp.a

    同样,将解包目录下的(jsoncpp-src-0.5.0)的include拷贝到/usr/lib下面。

    sudo mv include/json/ /usr/include/

    代码测试:

    1. #include
    2. #include
    3. using namespace std;
    4. int main(int argc, char** argv)
    5. {
    6. Json::Value root;
    7. Json::FastWriter fast;
    8. root["ModuleType"]= Json::Value("你好");
    9. root["ModuleCode"]= Json::Value("22");
    10. root["ModuleDesc"]= Json::Value("33");
    11. root["DateTime"]= Json::Value("44");
    12. root["LogType"]= Json::Value("55");
    13. cout<write(root)<
    14. return 0;
    15. }

    编译的语句:

    huqin@ubuntu:~/bstr/json$ g++ main.cpp -o main -L/home/huqin/bstr/json/Deps/lib32/libjsoncpp.a /home/huqin/bstr/json/Deps/lib32/libjsoncpp.a

    运行结果:

    1. huqin@ubuntu:~/bstr/json$ ./main
    2. {"DateTime":"44","LogType":"55","ModuleCode":"22","ModuleDesc":"33","ModuleType":"▒▒▒"}
    3. huqin@ubuntu:~/bstr/json$

    新版jsoncpp编译

     github地址:GitHub - open-source-parsers/jsoncpp: A C++ library for interacting with JSON.

    ## 使用源文件编译未编库

    在github上下载好以后,在命令行下进入该项目所在的地址,直接执行python amalgamate.py命令,会在dist目录下生成两个头文件和一个源文件json-forwards.h 、json.h和jsoncpp.cpp。因为jsoncpp源码就四五千行,直接放在jsconcpp.cpp中和工程中其他代码一起编译也比较方便。

    huqin@ubuntu:~/bstr/json/jsoncpp-master$ ./amalgamate.py
    1. #include
    2. #include "json/json.h"
    3. using namespace std;
    4. //封装json类
    5. class JsonParse
    6. {
    7. public:
    8. JsonParse(Json::Value J)
    9. :m_json(J)
    10. {};
    11. JsonParse(const void *V)
    12. :m_str(V ? (const char*)V : "")
    13. {};
    14. JsonParse(const char *S)
    15. :m_str(S ? S : "")
    16. {};
    17. JsonParse(const char *S, int L)
    18. :m_str(S ? S : "", S ? L : 0)
    19. {};
    20. JsonParse(std::string S)
    21. :m_str(S)
    22. {};
    23. virtual ~JsonParse(){};
    24. public:
    25. std::string toString(const char* indent="")
    26. {
    27. if(m_json.isObject() && m_json.getMemberNames().size() == 0)
    28. return "";
    29. else if(m_json.isString())
    30. return m_json.asString();
    31. Json::StreamWriterBuilder builder;
    32. if(indent)
    33. builder["indentation"] = indent; //The JSON document is written in a single line if indent == ""
    34. return Json::writeString(builder, m_json);
    35. };
    36. const char* toCString(const char* indent="")
    37. {
    38. m_str = toString(indent);
    39. return m_str.c_str();
    40. };
    41. bool toJson(Json::Value &J)
    42. {
    43. bool ret = false;
    44. JSONCPP_STRING errs;
    45. Json::CharReaderBuilder builder;
    46. Json::CharReaderBuilder::strictMode(&builder.settings_);
    47. //builder["collectComments"] = false; // true = 允许在反序列化的时候保存注释,然后在序列化的时候写回注释
    48. Json::CharReader* reader = builder.newCharReader();
    49. ret = reader->parse(m_str.data(), m_str.data() + m_str.size(), &J, &errs);
    50. if(!ret || !errs.empty())
    51. cout<<"error、"<
    52. if(reader){delete reader;reader = NULL;}
    53. return ret;
    54. }
    55. std::string formatMinSize()
    56. {
    57. /*
    58. * 仅支持构造入参为字符串的形式
    59. * 如果是Json::Value的构造形式,可以直接格式化成指定的indent
    60. */
    61. if(!m_str.empty())
    62. toJson(m_json);
    63. return toString();
    64. }
    65. private:
    66. std::string m_str;
    67. Json::Value m_json;
    68. };
    69. int main(int argc, char *argv[])
    70. {
    71. Json::Value boot;
    72. /* const char* / std::string -> JSON (除了首尾的分号其他分号必须加转义字符否则格式错误)*/
    73. JsonParse("{ \"datatype\":1,\"sessionId\" : 55,\"streamId\" : 55 ,\"string\" : \"sting recv\" }").toJson(boot);
    74. cout<<"string:" <"string"].asCString() <
    75. return 0;
    76. }
    77. //运行结果:
    78. huqin@ubuntu:~/bstr/json$ g++ main.cpp jsoncpp.cpp -o newmain
    79. huqin@ubuntu:~/bstr/json$ ./newmain
    80. string:sting recv

    ## 使用源码编译库使用

    准备工作下载cmake编译工具

    1. 卸载旧版cmake: $ sudo apt-get autoremove cmake
    2. 文件下载:$ wget https://cmake.org/files/v3.12/cmake-3.12.2-Linux-x86_64.tar.gz
    3. 解压:$ tar zxvf cmake-3.12.2-Linux-x86_64.tar.gz
    4. 创建软连接:先检查解压后的cmake文件路径,我的在/home/huqin/bstr/json/下:
    5. sudo ln -sf /home/huqin/bstr/json/cmake-3.12.2-Linux-x86_64/bin/* /usr/bin/
    6. 能检查出cmake --version说明cmake安装成功: $ cmake --version

    下载camke可以编译版本: GitHub - open-source-parsers/jsoncpp at 00.11.z

    1. //解压
    2. unzip jsoncpp-00.11.z.zip
    3. //进入目录使用cmake生成Makefile
    4. cd jsoncpp-00.11.z/
    5. cmake CMakeLists.txt
    6. //编译生成库
    7. make

    编译上面测试用例:

    1. 使用静态库直接连接动态库路径
    2. g++ main.cpp -o libmain /home/huqin/bstr/json/jsoncpp-00.11.z/lib/libjsoncpp_static.a
    3. 使用动态库首先将动态库拷贝到可检测目录
    4. sudo cp /home/huqin/bstr/json/jsoncpp-00.11.z/lib/libjsoncpp.so /usr/local/lib/
    5. g++ main.cpp -o libmain -ljsoncpp
    6. huqin@ubuntu:~/bstr/json$ ./libmain
    7. string:sting recv

    整体测试demo包含生成的库及jsoncpp、cmake源码:

    链接:https://pan.baidu.com/s/1xeS4OTGfvDKsTrqkmraJgg

    提取码:ykju

  • 相关阅读:
    TensorFlow自定义训练函数
    Spring MVC中如何获取Request,Response对象方法呢?
    MFC工控项目实例之十五定时刷新PC6325A模拟量输入
    有向图的强连通分量
    网络编程 day1
    【计算机视觉 | 目标检测】arxiv 计算机视觉关于分类和分割的学术速递(6月 22 日论文合集)
    fpm模式下读取到is_cli为何为true
    Win11怎么彻底关闭粘滞键功能
    现代 CSS 高阶技巧,完美的波浪进度条效果。
    MySQL数据库的初步了解
  • 原文地址:https://blog.csdn.net/qq_45689245/article/details/126211631