[英]How to use yaml-cpp in a C++ program on Linux?
I have recently decided to use yaml as my configuration file technology, and am writing a c++ linux application on OpenSuse 11.3. 我最近决定使用yaml作为我的配置文件技术,并在OpenSuse 11.3上编写了一个c ++ linux应用程序。
The problem is that even after successfully installing cmake, compilling yaml-cpp as shown on the yaml-cpp docs page, I still can't compile the simple demo programs on the yaml-cpp page here . 问题是,即使在成功安装cmake的,如图所示,YAML的CPP文档页面上compilling YAML-CPP,我仍然无法编译YAML-CPP页面上简单的演示程序在这里 。
For example, when I try to compile the the monster.yaml and main.cpp example 例如,当我尝试编译monster.yaml和main.cpp示例时
my compiler on issuing the command gcc main.cpp
, it issues the following errors: 我的编译器发出命令
gcc main.cpp
,它发出以下错误:
main.cpp:24:25: error: 'YAML' does not name a type
main.cpp:24:25:错误:'YAML'没有命名类型
main.cpp:24:35: error: expected unqualified-id before '&' tokenmain.cpp:24:35:错误:在'&'标记之前预期的unqualified-id
main.cpp:24:35: error: expected ')' before '&' tokenmain.cpp:24:35:错误:预期')'在'&'标记之前
main.cpp:24:35: error: expected initializer before '&' tokenmain.cpp:24:35:错误:'&'令牌之前的预期初始值设定项
main.cpp:30:25: error: 'YAML' does not name a typemain.cpp:30:25:错误:'YAML'没有命名类型
main.cpp:30:35: error: expected unqualified-id before '&' tokenmain.cpp:30:35:错误:在'&'标记之前预期的unqualified-id
main.cpp:30:35: error: expected ')' before '&' tokenmain.cpp:30:35:错误:预期')'在'&'标记之前
main.cpp:30:35: error: expected initializer before '&' tokenmain.cpp:30:35:错误:'&'令牌之前的预期初始值设定项
main.cpp:35:25: error: 'YAML' does not name a typemain.cpp:35:25:错误:'YAML'没有命名类型
main.cpp:35:35: error: expected unqualified-id before '&' tokenmain.cpp:35:35:错误:在'&'标记之前预期的unqualified-id
main.cpp:35:35: error: expected ')' before '&' tokenmain.cpp:35:35:错误:预期')'在'&'标记之前
main.cpp:35:35: error: expected initializer before '&' tokenmain.cpp:35:35:错误:'&'标记之前的预期初始化程序
I tried changing the include directive from #include "yaml-cpp/yaml.h"
to #include <yaml.h>
, since I'd installed the yaml lib, but this didn't solve anything. 我尝试将
#include "yaml-cpp/yaml.h"
中的#include <yaml.h>
指令更改为#include <yaml.h>
,因为我安装了yaml lib,但这并没有解决任何问题。
so what did I do wrong? 那我做错了什么?
Here is the problematic code pasted from lines 24 to 40: 以下是从第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);
}
}
And here is a dump of the output of the sudo make install
after I run the make
command: 以下是运行
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
Could there probably be some special directive / option that I have to append to the gcc
command when compiling with libyaml? 可能有一些特殊的指令/选项,我必须在使用libyaml编译时附加到
gcc
命令? something like gcc main.cpp -libyaml
? 像
gcc main.cpp -libyaml
?
For more output from the compiler ( gcc version 4.5.0 20100604 [gcc-4_5-branch revision 160292] (SUSE Linux)
) : 有关编译器的更多输出(
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'
and much more stuff than can fit here , finally ending in: 还有比这里更适合的东西,最后以:
/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
-- finally -- - 终于 -
Solved it with Chris's soln (see below), though I actually found an even cleaner way of pre-loading 'custom' libraries, by using the ldconfig
command to configure the library search path after i add the path to my libs into a *.conf
file in /etc/ld.so.conf.d/
. 解决了它与克里斯的解决方案 (见下文),虽然我实际上找到了一种更加清晰的预加载'自定义'库的方法,通过使用
ldconfig
命令配置库搜索路径后我将我的库的路径添加到*.conf
/etc/ld.so.conf.d/
*.conf
文件。 See the detailed guide here... 请参阅此处的详细指南...
gcc isn't being instructed to look in /usr/local. 没有指示gcc查看/ usr / local。 You need to do it explicitly.
你需要明确地做。 Also, that really should be g++ and not gcc.
而且,这应该是g ++而不是gcc。 So first make sure your include looks like this:
因此,首先要确保您的包含如下所示:
#include "yaml-cpp/yaml.h"
Then compile it like this: 然后像这样编译:
g++ -I/usr/local/include -L/usr/local/lib -lyaml-cpp -o testprogram main.cpp
It looks like it can't find the yaml-cpp headers. 它看起来无法找到yaml-cpp标头。 First of all, the include directive should be
首先,include指令应该是
#include "yaml-cpp/yaml.h"
since, as you can see, the headers are installed to /usr/local/include/yaml-cpp/
. 因为,正如您所看到的,标头安装在
/usr/local/include/yaml-cpp/
。
Do you get an error message on the line of the include statement? 您是否在include语句的行中收到错误消息? (Can you post the full compiler output?)
(你可以发布完整的编译器输出吗?)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.