当前位置: 首页 > 工具软件 > yaml-cpp > 使用案例 >

Linux C语言解析 yaml,如何在Linux上的C程序中使用yaml-cpp?

隆兴修
2023-12-01

我最近决定使用yaml作为我的配置文件技术,并在OpenSuse 11.3上编写一个c

linux应用程序.

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

我的编译器发出命令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

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 >::basic_ifstream(char const*, std::_Ios_Openmode)'

main.cpp:(.text+0x215): undefined reference to `YAML::Parser::Parser(std::basic_istream >&)'

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…

 类似资料: