5

我已经下载并安装了 jsoncpp 库。然后我尝试在我自己的应用程序中使用该库:

#include <json/json.h>

void parseJson() {
   Json::Reader reader;
} 

int main(int argc, char ** argv) {
   parseJson();
   exit(0);
}

该程序可以正常编译和链接,但在运行时会因 SIGSEGV 崩溃。gdb 回溯如下所示:

(gdb) bt
#0  0x0000003a560b7672 in __gnu_cxx::__exchange_and_add () from /usr/lib64/libstdc++.so.6
#1  0x00000000004031e9 in std::string::_Rep::_M_dispose (this=0xffffffffffffffe9, __a=@0x7fffbfe60e57)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:232
#2  0x0000000000403236 in ~basic_string (this=0x7fffbfe60fb0)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:478
#3  0x00000000004038d4 in ~Reader (this=0x7fffbfe60eb0) at /private/joaho/Parser/opm-parser/external/json/json-cpp/include/json/reader.h:23
#4  0x0000000000402990 in parseJson () at /private/joaho/Parser/opm-parser/opm/parser/eclipse/ExternalTests/ExternalTests.cpp:51
#5  0x00000000004029ab in main (argc=1, argv=0x7fffbfe610c8)
at /home/user/Parser/opm-parser/opm/parser/eclipse/ExternalTests/ExternalTests.cpp:56

即对我来说,它似乎在析构函数中崩溃了。据我所知, Json::Reader 没有自己的析构函数,所以这必须是默认析构函数。如您所见,我正在运行一个相当旧版本的 g++ - 这可能是问题吗?

4

1 回答 1

1

正如我评论的那样:

在 Debian/Sid(所以 libjsoncpp-dev 0.6.0~rc2-3)上使用 GCC 版本 4.8.1 编译时,因为g++-4.8 -g -Wall -I/usr/include/jsoncpp/ esjson.cc -ljsoncpp -o esjson 您的程序在没有警告的情况下编译,并且在运行时不会崩溃。

而且 GCC 4.1.2 真的很旧(2007 年 2 月!)并且不再受支持,并且不太符合 C++ 标准(GCC,现在是 4.8.1 版,自 4.1 以来在 C++ 标准一致性方面取得了巨大进步)。

所以我不确定GCC 4.1。是有缺陷的,但我不会对此感到惊讶:它在 C++ 中的声誉很差,从那以后,C++ 标准和 GCC 编译器都得到了很大的改进。为了更好地支持 C++ 以及改进诊断和优化,升级 GCC 是值得的。

所以我建议你使用更新的 GCC;如果您没有 root 访问权限,请考虑从其源 tarball 编译它;在源代码树之外构建它,例如../gcc-4.8.1/configure --program-suffix=-4.8 --prefix=$HOME/pubthen makethen make install- 在安装了它的依赖项之后

于 2013-07-28T18:37:48.013 回答