मैंने हाल ही में अपनी कॉन्फ़िगरेशन फ़ाइल तकनीक के रूप में yaml का उपयोग करने का निर्णय लिया है, और मैं OpenSuse 11.3.1 पर c++ linux एप्लिकेशन लिख रहा हूं।

समस्या यह है कि सफलतापूर्वक cmake स्थापित करने के बाद भी, yaml-cpp दस्तावेज़ पृष्ठ पर दिखाए गए अनुसार yaml-cpp को संकलित करने के बाद भी, मैं अभी भी yaml-cpp पृष्ठ यहां

उदाहरण के लिए, जब मैं monster.yaml और main.cpp को संकलित करने का प्रयास करता हूं उदाहरण

मेरा कंपाइलर gcc main.cpp आदेश जारी करने पर, यह निम्नलिखित त्रुटियों को जारी करता है:

main.cpp:24:25: त्रुटि: 'YAML' एक प्रकार का नाम नहीं है
main.cpp:24:35: त्रुटि: '&' टोकन से पहले अपेक्षित अयोग्य-आईडी
main.cpp:24:35: त्रुटि: अपेक्षित ')' '&' टोकन से पहले
main.cpp:24:35: त्रुटि: '&' टोकन से पहले अपेक्षित प्रारंभकर्ता
main.cpp:30:25: त्रुटि: 'YAML' एक प्रकार का नाम नहीं है
main.cpp:30:35: त्रुटि: '&' टोकन से पहले अपेक्षित अयोग्य-आईडी
main.cpp:30:35: त्रुटि: अपेक्षित ')' '&' टोकन से पहले
main.cpp:30:35: त्रुटि: '&' टोकन से पहले अपेक्षित प्रारंभकर्ता
main.cpp:35:25: त्रुटि: 'YAML' एक प्रकार का नाम नहीं है
main.cpp:35:35: त्रुटि: '&' टोकन से पहले अपेक्षित अयोग्य-आईडी
main.cpp:35:35: त्रुटि: अपेक्षित ')' '&' टोकन से पहले
main.cpp:35:35: त्रुटि: '&' टोकन से पहले अपेक्षित प्रारंभकर्ता

मैंने शामिल निर्देश को #include "yaml-cpp/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 कमांड का उपयोग किया गया। मैं अपने libs के पथ को *.conf फ़ाइल में /etc/ld.so.conf.d/ में जोड़ता हूं। विस्तृत मार्गदर्शिका यहां देखें...

8
JWL 17 अप्रैल 2011, 17:09
Main.cpp लाइन 24 30 और 35 . से कोड पेस्ट करें
 – 
fazo
17 अप्रैल 2011, 17:34

2 जवाब

सबसे बढ़िया उत्तर

जीसीसी को/usr/स्थानीय देखने का निर्देश नहीं दिया जा रहा है। आपको इसे स्पष्ट रूप से करने की ज़रूरत है। साथ ही, यह वास्तव में जी ++ होना चाहिए और जीसीसी नहीं होना चाहिए। तो पहले सुनिश्चित करें कि आपका शामिल इस तरह दिखता है:

#include "yaml-cpp/yaml.h"

फिर इसे इस तरह संकलित करें:

g++ -I/usr/local/include -L/usr/local/lib -lyaml-cpp -o testprogram main.cpp
9
Chris Eberle 18 अप्रैल 2011, 09:35
यह वास्तव में प्रोग्राम को ठीक से संकलित करता है, लेकिन जब मैं निष्पादन योग्य को ./testprogram के साथ चलाने का प्रयास करता हूं, तो मुझे रन-टाइम त्रुटि मिलती है: ./testprogram: error while loading shared libraries: libyaml-cpp.so.0.2: cannot open shared object file: No such file or directory
 – 
JWL
18 अप्रैल 2011, 17:05
$> LD_PRELOAD=/usr/local/lib/libyaml-cpp.so ./testprogram
 – 
Chris Eberle
18 अप्रैल 2011, 20:54
यदि उपरोक्त पंक्ति काम करती है, तो आपको अपने पुस्तकालय खोज पथ में libyaml-cpp.so का पथ जोड़ना होगा। मुझे याद नहीं है कि यह कैसे करना है, आपको उस पर Google करना होगा। बेहतर तरीका यह है कि जब आप किसी प्रोग्राम को कंपाइल कर रहे हों, तो उसे /usr पर इंस्टॉल करें न कि /usr/लोकल पर।
 – 
Chris Eberle
18 अप्रैल 2011, 20:55
धन्यवाद, यह रन-टाइम त्रुटि भी हल करता है। एकमात्र अन्य मुद्दा अब राक्षस.यमल प्रारूप से प्रतीत होता है। लेकिन फ़ाइल में कुछ भी नहीं होने से त्रुटियां गायब हो जाती हैं। अब मैं अपने सामान का परीक्षण करूंगा :-)
 – 
JWL
18 अप्रैल 2011, 21:13
1
@ क्रिस, मुझे वास्तव में ldconfig कमांड का उपयोग करके 'कस्टम' पुस्तकालयों को प्री-लोड करने का एक साफ तरीका मिला है, जब मैं अपने libs में पथ को *.conf फ़ाइल में जोड़ने के बाद लाइब्रेरी खोज पथ को कॉन्फ़िगर करने के लिए कमांड का उपयोग कर रहा हूं। में /etc/ld.so.conf.d/
 – 
JWL
20 अप्रैल 2011, 20:54

ऐसा लगता है कि यह yaml-cpp शीर्षलेख नहीं ढूंढ सकता है। सबसे पहले, शामिल निर्देश होना चाहिए

#include "yaml-cpp/yaml.h"

चूंकि, जैसा कि आप देख सकते हैं, हेडर्स /usr/local/include/yaml-cpp/ में इंस्टाल हो गए हैं।

क्या आपको शामिल कथन की पंक्ति पर एक त्रुटि संदेश मिलता है? (क्या आप पूर्ण कंपाइलर आउटपुट पोस्ट कर सकते हैं?)

0
Jesse Beder 17 अप्रैल 2011, 23:36
हाँ, मैंने make और sudo make install को चलाया, लेकिन फिर भी समस्याएँ आई!
 – 
JWL
17 अप्रैल 2011, 21:47
मैंने मेक कमांड से आउटपुट जोड़ा है, आपको क्या लगता है कि क्या गलत है?
 – 
JWL
17 अप्रैल 2011, 22:09
वहां, मैंने कंपाइलर आउटपुट का हिस्सा चिपकाया है (यह मेरे द्वारा यहां रखे जाने की तुलना में बहुत अधिक था!), लेकिन मैंने केवल इस आउटपुट की शुरुआत और अंत का हिस्सा शामिल किया है। आपकी चिंता के लिए धन्यवाद।
 – 
JWL
18 अप्रैल 2011, 09:31
@mcnemesis, तो बस स्पष्ट करने के लिए: संकलक आउटपुट error: 'YAML' does not name a type की पहली पंक्ति है? मैं जो खोज रहा हूं, क्या संकलक #include "yaml-cpp/yaml.h" लाइन से खुश है?
 – 
Jesse Beder
18 अप्रैल 2011, 11:38