簡體   English   中英

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

[英]How to use yaml-cpp in a C++ program on Linux?

我最近決定使用yaml作為我的配置文件技術,並在OpenSuse 11.3上編寫了一個c ++ linux應用程序。

問題是,即使在成功安裝cmake的,如圖所示,YAML的CPP文檔頁面上compilling YAML-CPP,我仍然無法編譯YAML-CPP頁面上簡單的演示程序在這里

例如,當我嘗試編譯monster.yaml和main.cpp示例時

我的編譯器發出命令gcc main.cpp ,它發出以下錯誤:

main.cpp:24:25:錯誤:'YAML'沒有命名類型
main.cpp:24:35:錯誤:在'&'標記之前預期的unqualified-id
main.cpp:24:35:錯誤:預期')'在'&'標記之前
main.cpp:24:35:錯誤:'&'令牌之前的預期初始值設定項
main.cpp:30:25:錯誤:'YAML'沒有命名類型
main.cpp:30:35:錯誤:在'&'標記之前預期的unqualified-id
main.cpp:30:35:錯誤:預期')'在'&'標記之前
main.cpp:30:35:錯誤:'&'令牌之前的預期初始值設定項
main.cpp:35:25:錯誤:'YAML'沒有命名類型
main.cpp:35:35:錯誤:在'&'標記之前預期的unqualified-id
main.cpp:35:35:錯誤:預期')'在'&'標記之前
main.cpp:35:35:錯誤:'&'標記之前的預期初始化程序

我嘗試將#include "yaml-cpp/yaml.h"中的#include <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);
   }
}

以下是運行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 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/ *.conf文件。 請參閱此處詳細指南...

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

它看起來無法找到yaml-cpp標頭。 首先,include指令應該是

#include "yaml-cpp/yaml.h"

因為,正如您所看到的,標頭安裝在/usr/local/include/yaml-cpp/

您是否在include語句的行中收到錯誤消息? (你可以發布完整的編譯器輸出嗎?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM