如何在Linux上的C ++程序中使用yaml-cpp?

时间:2011-04-17 13:09:30

标签: c++ yaml yaml-cpp

我最近决定使用yaml作为配置文件技术,并在OpenSuse 11.3上编写c ++ linux应用程序。

问题是,即使在成功安装cmake之后,如yaml-cpp docs页面所示,编译yaml-cpp,我仍然无法在yaml-cpp页面here上编译简单的演示程序。 / p>

例如,当我尝试编译monster.yaml and main.cpp example

我的编译器在发出命令gcc main.cpp时发出以下错误:

  

main.cpp:24:25:错误:'YAML'没有命名类型
  main.cpp:24:35:错误:在'&'标记之前预期不合格的id   main.cpp:24:35:错误:预期')'在'&'标记之前   main.cpp:24:35:错误:'&'标记之前的预期初始化程序   main.cpp:30:25:错误:'YAML'没有命名类型
  main.cpp:30:35:错误:在'&'标记之前预期不合格的id   main.cpp:30:35:错误:预期')'在'&'标记之前   main.cpp:30:35:错误:'&'标记之前的预期初始化程序   main.cpp:35:25:错误:'YAML'没有命名类型
  main.cpp:35:35:错误:在'&'标记之前预期的nonqualified-id   main.cpp:35:35:错误:预期')'在'&'标记之前   main.cpp:35:35:错误:'&'标记之前的预期初始化程序

我尝试将include指令从#include "yaml-cpp/yaml.h"更改为#include <yaml.h>,因为我安装了yaml lib,但这并没有解决任何问题。

那我做错了什么?

以下是从第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

在使用libyaml进行编译时,是否可能有一些特殊的指令/选项要附加到gcc命令?类似于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

- 终于 -

解决它与Chris的解决方案(见下文),虽然我实际上找到了一种更加清晰的预加载'自定义'库的方法,使用ldconfig命令配置库将我的库中的路径添加到*.conf中的/etc/ld.so.conf.d/文件后,搜索路径。请参阅detailed guide here...

2 个答案:

答案 0 :(得分:8)

没有指示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

答案 1 :(得分:0)

它看起来无法找到yaml-cpp标头。首先,include指令应该是

#include "yaml-cpp/yaml.h"

因为,如您所见,标题已安装到/usr/local/include/yaml-cpp/

您是否在include语句的行中收到错误消息? (你可以发布完整的编译器输出吗?)