jsoncpp ubuntu编译问题
直接编译之后链接发现找不到 Json::Value::asString() const
很奇怪,发现是因为 libstdc++ 双ABI 不一致导致,GCC5 以后std::string / std::list …
引入了新 ABI(符号名里会多出 __cxx11
)。
- 如果 库是在旧 ABI
而 你的工程用默认的新 ABI (=1),链接器就只在可执行文件端生成-D_GLIBCXX_USE_CXX11_ABI=0 # gcc4时代的 ABI
却在静态库里找不到同名符号,于是报 undefined reference。Json::Value::asString[abi:cxx11]() const
一、快速验证
-
查看库里符号(静态库同理,对应
.o
)nm -C libjsoncpp.a | grep asString
旧 ABI 会显示
Json::Value::asString() const
新 ABI 会显示
Json::Value::asString[abi:cxx11]() const
-
再看编译出的对象文件:
nm -C CMakeFiles/.../SipDirectory.cpp.o | grep asString
如果出现
[abi:cxx11]
而前一步没有,就说明 “程序在新 ABI、库在旧 ABI”。
二.解决办法
修改jsoncpp源码中顶级cmakelist文件,在其中加入:
add_compile_definitions(_GLIBCXX_USE_CXX11_ABI=0)