Как использовать yaml-cpp в программе на C ++ в Linux? - PullRequest
8 голосов
/ 17 апреля 2011

Недавно я решил использовать yaml в качестве технологии файлов конфигурации, и я пишу Linux-приложение c ++ для OpenSuse 11.3.

Проблема в том, что даже после успешной установки cmake и компиляции yaml-cpp, как показано на странице документации yaml-cpp, я все еще не могу скомпилировать простые демонстрационные программы на странице yaml-cpp здесь .

Например, когда я пытаюсь скомпилировать monster.yaml и main.cpp пример

Мой компилятор при вводе команды gcc main.cpp выдает следующие ошибки:

main.cpp: 24: 25: ошибка: YAML не называет тип
main.cpp: 24: 35: ошибка: ожидаемый неквалифицированный идентификатор перед токеном ‘&’
main.cpp: 24: 35: ошибка: ожидается ‘)’ до символа ‘&’
main.cpp: 24: 35: ошибка: ожидаемый инициализатор до токена ‘&’
main.cpp: 30: 25: ошибка: YAML не называет тип
main.cpp: 30: 35: ошибка: ожидаемый неквалифицированный идентификатор перед токеном ‘&’
main.cpp: 30: 35: ошибка: ожидается ‘)’ перед символом ‘&’
main.cpp: 30: 35: ошибка: ожидаемый инициализатор до токена ‘&’
main.cpp: 35: 25: ошибка: YAML не называет тип
main.cpp: 35: 35: ошибка: ожидаемый неквалифицированный идентификатор перед маркером ‘&’
main.cpp: 35: 35: ошибка: ожидается ‘)’ перед символом ‘&’
main.cpp: 35: 35: ошибка: ожидаемый инициализатор до токена ‘&’

Я попытался изменить директиву включения с #include "yaml-cpp/yaml.h" на #include <yaml.h>, поскольку я установил библиотеку yaml, но это ничего не решило.

так что я сделал не так?

Вот проблемный код, вставленный из строк с 24 по 40:

void operator >> (const YAML::Node& node, Vec3& v) {
   node[0] >> v.x;
   node[1] >> v.y;
   node[2] >> v.z;
}

void operator >> (const YAML::Node& node, Power& power) {
   node["name"] >> power.name;
   node["damage"] >> power.damage;
}

void operator >> (const YAML::Node& node, Monster& monster) {
   node["name"] >> monster.name;
   node["position"] >> monster.position;
   const YAML::Node& powers = node["powers"];
   for(unsigned i=0;i<powers.size();i++) {
      Power power;
      powers[i] >> power;
      monster.powers.push_back(power);
   }
}

А вот дамп вывода sudo make install после запуска команды make:

[ 81%] Built target yaml-cpp
[ 96%] Built target run-tests
[100%] Built target parse
Install the project...
-- Install configuration:      "Release"                                                                                                                                              
-- Installing: /usr/local/lib/libyaml-cpp.so.0.2.6
-- Up-to-date: /usr/local/lib/libyaml-cpp.so.0.2
-- Up-to-date: /usr/local/lib/libyaml-cpp.so
-- Up-to-date: /usr/local/include/yaml-cpp/aliasmanager.h
-- Up-to-date: /usr/local/include/yaml-cpp/anchor.h
-- Up-to-date: /usr/local/include/yaml-cpp/conversion.h
-- Up-to-date: /usr/local/include/yaml-cpp/dll.h
-- Up-to-date: /usr/local/include/yaml-cpp/emitfromevents.h
-- Up-to-date: /usr/local/include/yaml-cpp/emitter.h
-- Up-to-date: /usr/local/include/yaml-cpp/emittermanip.h
-- Up-to-date: /usr/local/include/yaml-cpp/eventhandler.h
-- Up-to-date: /usr/local/include/yaml-cpp/exceptions.h
-- Up-to-date: /usr/local/include/yaml-cpp/iterator.h
-- Up-to-date: /usr/local/include/yaml-cpp/ltnode.h
-- Up-to-date: /usr/local/include/yaml-cpp/mark.h
-- Up-to-date: /usr/local/include/yaml-cpp/node.h
-- Up-to-date: /usr/local/include/yaml-cpp/nodeimpl.h
-- Up-to-date: /usr/local/include/yaml-cpp/nodereadimpl.h
-- Up-to-date: /usr/local/include/yaml-cpp/nodeutil.h
-- Up-to-date: /usr/local/include/yaml-cpp/noncopyable.h
-- Up-to-date: /usr/local/include/yaml-cpp/null.h
-- Up-to-date: /usr/local/include/yaml-cpp/ostream.h
-- Up-to-date: /usr/local/include/yaml-cpp/parser.h
-- Up-to-date: /usr/local/include/yaml-cpp/stlemitter.h
-- Up-to-date: /usr/local/include/yaml-cpp/stlnode.h
-- Up-to-date: /usr/local/include/yaml-cpp/traits.h
-- Up-to-date: /usr/local/include/yaml-cpp/yaml.h
-- Up-to-date: /usr/local/include/yaml-cpp/anchordict.h
-- Up-to-date: /usr/local/include/yaml-cpp/graphbuilder.h
-- Installing: /usr/local/lib/pkgconfig/yaml-cpp.pc

Возможно, есть какая-то специальная директива / опция, которую я должен добавить к команде gcc при компиляции с libyaml? что-то вроде gcc main.cpp -libyaml?

Для получения дополнительной информации от компилятора (gcc version 4.5.0 20100604 [gcc-4_5-branch revision 160292] (SUSE Linux)):

/tmp/ccYltArL.o: In function `operator>>(YAML::Node const&, Monster&)':
main.cpp:(.text+0x1a8): undefined reference to `YAML::Node::size() const'
/tmp/ccYltArL.o: In function `main':
main.cpp:(.text+0x1fe): undefined reference to `std::basic_ifstream<char,      std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode)'
main.cpp:(.text+0x215): undefined reference to   `YAML::Parser::Parser(std::basic_istream<char, std::char_traits<char> >&)'
main.cpp:(.text+0x224): undefined reference to `YAML::Node::Node()'
main.cpp:(.text+0x23e): undefined reference to    `YAML::Parser::GetNextDocument(YAML::Node&)'
main.cpp:(.text+0x29c): undefined reference to `std::cout'

и многое другое, чем может поместится здесь , наконец, заканчивается:

/tmp/ccYltArL.o:(.rodata._ZTIN4YAML14BadDereferenceE[typeinfo for YAML::BadDereference]+0x0): undefined reference to `vtable for    __cxxabiv1::__si_class_type_info'
/tmp/ccYltArL.o:(.rodata._ZTIN4YAML11KeyNotFoundE[typeinfo for YAML::KeyNotFound]+0x0): undefined reference to `vtable for  __cxxabiv1::__si_class_type_info'
/tmp/ccYltArL.o:(.rodata._ZTIN4YAML13InvalidScalarE[typeinfo for YAML::InvalidScalar]+0x0): more undefined references to `vtable for __cxxabiv1::__si_class_type_info' follow
/tmp/ccYltArL.o:(.rodata._ZTIN4YAML9ExceptionE[typeinfo for YAML::Exception]+0x8): undefined reference to `typeinfo for std::runtime_error'
/tmp/ccYltArL.o:(.eh_frame+0x18f): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

- наконец -

Решено с помощью Криса Солна (см. Ниже), хотя я действительно нашел более чистый способ предварительной загрузки «пользовательских» библиотек, используя команду ldconfig для настройки пути поиска библиотеки после я добавляю путь к моим библиотекам в *.conf файл в /etc/ld.so.conf.d/. Смотрите подробное руководство здесь ...

Ответы [ 2 ]

9 голосов
/ 18 апреля 2011

gcc не инструктируется искать в / usr / local.Вы должны сделать это явно.Кроме того, это действительно должен быть g ++, а не gcc.Поэтому сначала убедитесь, что ваше включение выглядит так:

#include "yaml-cpp/yaml.h"

Затем скомпилируйте его так:

g++ -I/usr/local/include -L/usr/local/lib -lyaml-cpp -o testprogram main.cpp
0 голосов
/ 17 апреля 2011

Похоже, он не может найти заголовки yaml-cpp.Прежде всего, директива include должна быть

#include "yaml-cpp/yaml.h"

, поскольку, как вы можете видеть, заголовки установлены в /usr/local/include/yaml-cpp/.

Вы получаете сообщение об ошибке в строкеоператор включения?(Можете ли вы опубликовать полный вывод компилятора?)

...