मैंने हाल ही में अपनी कॉन्फ़िगरेशन फ़ाइल तकनीक के रूप में 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/
में जोड़ता हूं। विस्तृत मार्गदर्शिका यहां देखें...
2 जवाब
जीसीसी को/usr/स्थानीय देखने का निर्देश नहीं दिया जा रहा है। आपको इसे स्पष्ट रूप से करने की ज़रूरत है। साथ ही, यह वास्तव में जी ++ होना चाहिए और जीसीसी नहीं होना चाहिए। तो पहले सुनिश्चित करें कि आपका शामिल इस तरह दिखता है:
#include "yaml-cpp/yaml.h"
फिर इसे इस तरह संकलित करें:
g++ -I/usr/local/include -L/usr/local/lib -lyaml-cpp -o testprogram main.cpp
./testprogram
के साथ चलाने का प्रयास करता हूं, तो मुझे रन-टाइम त्रुटि मिलती है: ./testprogram: error while loading shared libraries: libyaml-cpp.so.0.2: cannot open shared object file: No such file or directory
$> LD_PRELOAD=/usr/local/lib/libyaml-cpp.so ./testprogram
ldconfig
कमांड का उपयोग करके 'कस्टम' पुस्तकालयों को प्री-लोड करने का एक साफ तरीका मिला है, जब मैं अपने libs में पथ को *.conf
फ़ाइल में जोड़ने के बाद लाइब्रेरी खोज पथ को कॉन्फ़िगर करने के लिए कमांड का उपयोग कर रहा हूं। में /etc/ld.so.conf.d/
ऐसा लगता है कि यह yaml-cpp शीर्षलेख नहीं ढूंढ सकता है। सबसे पहले, शामिल निर्देश होना चाहिए
#include "yaml-cpp/yaml.h"
चूंकि, जैसा कि आप देख सकते हैं, हेडर्स /usr/local/include/yaml-cpp/
में इंस्टाल हो गए हैं।
क्या आपको शामिल कथन की पंक्ति पर एक त्रुटि संदेश मिलता है? (क्या आप पूर्ण कंपाइलर आउटपुट पोस्ट कर सकते हैं?)
make
और sudo make install
को चलाया, लेकिन फिर भी समस्याएँ आई!
error: 'YAML' does not name a type
की पहली पंक्ति है? मैं जो खोज रहा हूं, क्या संकलक #include "yaml-cpp/yaml.h"
लाइन से खुश है?
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।