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 で GCC バージョン 4.8.1 を使用してコンパイルすると (つまり libjsoncpp-dev 0.6.0~rc2-3) 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 コンパイラの両方が大幅に改善されました。GCC をアップグレードすることは、C++ のサポートを改善し、診断と最適化を改善するために、努力する価値があります。

したがって、新しい GCC を使用することをお勧めします。root アクセス権がない場合は、ソース tarball からコンパイルすることを検討してください。依存関係をインストールした後、たとえば../gcc-4.8.1/configure --program-suffix=-4.8 --prefix=$HOME/pubthen makethenを使用してソースツリーの外側にビルドしますmake install

于 2013-07-28T18:37:48.013 に答える