2011-04-17 30 views
8

我最近決定使用yaml作爲我的配置文件技術,並且正在OpenSuse 11.3上編寫一個C++ linux應用程序。如何在Linux上的C++程序中使用yaml-cpp?

問題是,即使在成功安裝cmake後,按照yaml-cpp文檔頁面上顯示的方式編譯yaml-cpp,我仍然無法編譯yaml-cpp頁面here上的簡單演示程序。

例如,當我嘗試編譯上發出命令gcc main.cpp中的monster.yaml and main.cpp example

我的編譯器,它會發出以下錯誤:

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指令從#include "yaml-cpp/yaml.h"#include <yaml.h> ,因爲我安裝了yaml庫,但是這並沒有解決任何問題。

那麼我做錯了什麼?

這裏是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 

- 終於 -

解決它與克里斯的soln(見雖然我實際上找到了一種更加簡潔的預加載「自定義」庫的方法,在將我的庫路徑添加到/etc/ld.so.conf.d/中的*.conf文件後,使用ldconfig命令配置庫搜索路徑。請參閱detailed guide here...

+0

粘貼代碼的main.cpp線24 30和35 – fazo 2011-04-17 13:34:39

回答

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 
+0

這確實能夠正確編譯程序,但是當我嘗試使用'。/ testprogram'運行可執行文件時,出現運行時錯誤:'./testprogram:加載共享庫時出錯:libyaml-cpp.so.0.2 :無法打開共享目標文件:沒有這樣的文件或目錄' – nemesisfixx 2011-04-18 13:05:56

+0

'$> LD_PRELOAD =/usr/local/lib/libyaml-cpp.so。/ testprogram' – 2011-04-18 16:54:21

+0

如果上面的代碼行,你需要添加libyaml- cpp.so是您的圖書館搜索路徑的路徑。我不記得如何做到這一點,你需要谷歌那一個。更好的方法是在編譯程序時,將其安裝到/ usr而不是/ usr/local。 – 2011-04-18 16:55:45

0

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

#include "yaml-cpp/yaml.h" 

,因爲正如你所看到的,頭文件被安裝到/usr/local/include/yaml-cpp/

你是否在include語句的行上收到錯誤消息? (你能發佈完整的編譯器輸出嗎?)

+0

是的,我沒有運行'make'和'sudo make install',但仍然有問題! – nemesisfixx 2011-04-17 17:47:55

+0

我已經添加了make命令的輸出,你認爲什麼是錯誤的? – nemesisfixx 2011-04-17 18:09:16

+0

@mcnemesis,編輯 - 你可以發佈完整的編譯器輸出? – 2011-04-17 19:36:41

相關問題