编译JsonCpp解析URL代码时遇头文件及C++版本错误求助
看起来你在编译结合libcurl和jsoncpp的代码时碰到了两个典型的编译障碍,我来一步步帮你搞定:
1. 头文件找不到的问题
你一开始遇到的fatal error: json/json.h: No such file or directory,是因为服务器上jsoncpp的头文件安装路径和常规路径不一致。解决这个问题有两种思路:
方法一:修改编译命令,指定头文件搜索目录
不用改动代码里的#include <json/json.h>,而是在编译时用-I参数告诉编译器去哪里找这个头文件。先通过下面的命令确认jsoncpp头文件的实际位置:
find /usr/include -name "json.h"
假设输出是/usr/include/jsoncpp/json/json.h,说明头文件的根目录是/usr/include/jsoncpp,那编译命令就改成:
g++ main.cpp -I/usr/include/jsoncpp -ljsoncpp -lcurl -o example.out
这样编译器就能顺利找到<json/json.h>了。
方法二:修改代码中的头文件路径
如果你已经把代码里的头文件改成了#include <jsoncpp/json/json.h>,只要编译器能搜索到这个路径也能解决问题,但这种方式会降低代码的可移植性,更推荐用方法一。
2. C++标准版本不兼容的问题
改完头文件后出现的#error This file requires compiler and library support for the ISO C++ 2011 standard...(完整错误信息),是因为你的编译器默认使用老旧的C98标准,而jsoncpp依赖C11及以上的特性。
解决这个问题很简单,在编译命令里加上-std=c++11即可(gcc 5已经支持C++11,也可以用更高版本如-std=c++14、-std=c++17)。
结合头文件的解决方法,最终完整的编译命令应该是:
g++ main.cpp -std=c++11 -I/usr/include/jsoncpp -ljsoncpp -lcurl -o example.out
如果是用修改头文件路径的方式,命令就是:
g++ main.cpp -std=c++11 -ljsoncpp -lcurl -o example.out
额外验证
你可以先单独验证jsoncpp的编译环境是否正常,比如写一段简单的测试代码:
#include <json/json.h> #include <iostream> int main() { Json::Value root; root["test"] = "hello"; std::cout << root.toStyledString() << std::endl; return 0; }
用上面的编译命令编译运行,如果能正常输出格式化的JSON字符串,说明jsoncpp环境没问题,再结合libcurl的代码一起编译就不会有问题了。
内容的提问来源于stack exchange,提问作者Ehsan

