问题是,即使成功安装了cmake,如yaml-cpp docs页面所示,编译yaml-cpp,我仍然无法在yaml-cpp页面here上编译简单的演示程序.
例如,当我尝试编译monster.yaml and main.cpp example时
我的编译器发出命令gcc main.cpp,它发出以下错误:
main.cpp:24:25: error: ‘YAML’ does not name a type
main.cpp:24:35: error: expected unqualified-id before ‘&’ token
main.cpp:24:35: error: expected ‘)’ before ‘&’ token
main.cpp:24:35: error: expected initializer before ‘&’ token
main.cpp:30:25: error: ‘YAML’ does not name a type
main.cpp:30:35: error: expected unqualified-id before ‘&’ token
main.cpp:30:35: error: expected ‘)’ before ‘&’ token
main.cpp:30:35: error: expected initializer before ‘&’ token
main.cpp:35:25: error: ‘YAML’ does not name a type
main.cpp:35:35: error: expected unqualified-id before ‘&’ token
main.cpp:35:35: error: expected ‘)’ before ‘&’ token
main.cpp:35:35: error: expected initializer before ‘&’ token
我尝试将#include“yaml-cpp / yaml.h”中的include指令更改为#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); } }
以下是运行make命令后sudo make install输出的转储:
[ 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版本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命令配置库搜索路径后我将我的库的路径添加到*中. /etc/ld.so.conf.d/中的conf文件.见detailed guide here…
解决方法
#include "yaml-cpp/yaml.h"
然后像这样编译它:
g++ -I/usr/local/include -L/usr/local/lib -lyaml-cpp -o testprogram main.cpp