2013-07-28 4 views
4

Я загрузил и установил библиотеку jsoncpp. Затем я пытаюсь использовать библиотеку в моем приложении:Jsoncpp - очень простые тестовые сбои, когда Json :: reader выходит из области

#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, [email protected]) 
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 

I.e. мне кажется, что он врезался в деструктор. Насколько я могу судить, Json :: Reader не имеет собственного dstructor, поэтому это должен быть деструктор по умолчанию. Как вы можете видеть, я запускаю довольно старую версию g ++ - может быть, проблема?

+1

При компиляции с GCC версии 4.8.1 на Debian/Sid (так libjsoncpp-DEV '0.6.0 ~ rc2-3') как' г ++ - 4.8 -g - Wall -I/usr/include/jsoncpp/esjson.cc -ljsoncpp -o esjson' ваша программа скомпилирована без предупреждений и не сбой при запуске. –

+0

У меня была эта точная проблема в VS2013. Это произошло из-за отсутствия ссылки на отладочную версию библиотеки при выполнении отладочной сборки. – matth

+0

Я видел эту проблему в небольшом проекте кода спагетти, у меня есть статичные ссылки в webrtc (который ссылается на jsoncpp), а также динамически включает jsoncpp через другую библиотеку. – mpr

ответ

1

Как я заметил:

При компиляции с GCC версии 4.8.1 на Debian/Sid (так 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 действительно старая (febr. 2007!) И больше не поддерживается, и не очень хорошо C++ стандарт конформным (GCC, теперь в версии 4.8.1, сделал огромный прогресс на C++ стандарт соответствия, так как 4,1).

Так что я не уверен, что GCC 4.1. неисправен, но я не удивлюсь: он имел плохую репутацию C++, и с тех пор как стандарт C++, так и компилятор GCC были улучшены. Модернизация GCC стоит усилий, как для лучшей поддержки C++, так и для улучшения диагностики и оптимизации.

Поэтому я предлагаю вам использовать новый GCC; если у вас нет корневого доступа, подумайте о компиляции его из исходного архива; строить его за пределами исходного дерева, например. Затем ../gcc-4.8.1/configure --program-suffix=-4.8 --prefix=$HOME/pubmake затем make install - после установки его зависимостей

+0

Благодарим вас за усилия; Думаю, я обвиню старый gcc-компилятор. Причина, по которой я немного неохотно устанавливаю новый компилятор, заключается в том, что я нахожусь в консервативной корпоративной среде, а приложения, которые я пишу, должны работать во время выполнения (т. Е. Gcc-4.1.2), распространяемое по всей организации. Мои потребности json довольно просты, поэтому, возможно, я попытаюсь найти другую (чистую C?) Библиотеку. – user422005

+0

Есть и другие веские причины защищать в вашей корпорации использование нового компилятора GCC: лучшее стандартное соответствие, улучшенная оптимизация, лучшая диагностика .... Использование GCC 4.1 для любого программирования на C++ требует глубоких проблем. (Большинство ошибок компилятора * сложнее найти *, чем этот). –

 Смежные вопросы

  • Нет связанных вопросов^_^