2010-12-31 13 views
9

मैं अपने कार्यक्रम में समाज को लागू करने की कोशिश कर रहा हूं लेकिन मुझे नहीं पता कि कैसे। मैं नेटबीन का उपयोग कर एक परियोजना पर लिनक्स पर सी ++ का उपयोग कर रहा हूं। मैंने इसे स्थापित करने के लिए http://soci.sourceforge.net/doc/structure.html में चरणों का पालन किया है, और मैंने अपनी प्रोजेक्ट में/src/core और soci-mysql.h से/src/backends/mysql से soci.h फ़ाइलों को कॉपी करने का प्रयास किया है, लेकिन यह एक संकलन त्रुटि देता है (इन फ़ाइलों में अन्य सोसाइटी फाइलें शामिल हैं, लेकिन सभी फ़ाइलों को निर्देशिका में कॉपी करना अजीब है ...)। मैंने गाइड को कई बार पढ़ा है लेकिन मुझे समझ में नहीं आता कि मैं क्या गलत कर रहा हूं। उदाहरणों में केवल इन फ़ाइलों को शामिल किया गया है।एसओसीआई सी ++ डाटाबेस लाइब्रेरी का उपयोग कैसे करें?

धन्यवाद।

संपादित करें: मैंने उत्तर के नीचे एक टिप्पणी में अधिक जानकारी दी है। मुझे नहीं पता कि समाज को लागू करने के लिए मुझे किन कदमों का पालन करना है।

+0

क्या आप वास्तव में 'इंस्टॉल करें' चलाते थे? अपनी प्रोजेक्ट की निर्देशिका में हेडर फ़ाइलों की प्रतिलिपि बनाने की कोई आवश्यकता नहीं है। – chrisaycock

+1

मैंने उस आदेश को चलाया था।अगर मैं उन फ़ाइलों की प्रतिलिपि नहीं बनाता तो संकलक एक त्रुटि देता है जिसमें कहा गया है कि soci.h और soci-mysql.h फ़ाइलें नहीं मिलीं। मैं सिर्फ दस्तावेजों पर एक उदाहरण से निम्नलिखित शामिल करता हूं: [कोड] # शामिल "soci.h" # शामिल "soci-mysql.h" [/ code] लेकिन यह काम नहीं किया, संकलक ने कहा कि उन फ़ाइलों ने नहीं किया अस्तित्व में नहीं है, इसलिए मैंने उन्हें सोशल पैकेज से कॉपी करने की कोशिश की। – NeDark

उत्तर

6

उस पृष्ठ पर प्रासंगिक सा है

कॉन्फ़िगर स्क्रिप्ट पैरामीटर के बिना चलाया जाता है, प्रक्रिया के शेष भाग एक डिफ़ॉल्ट और /usr/local/lib के लिए एक डिफ़ॉल्ट गंतव्य के रूप में समाज हेडर फाइल के लिए गंतव्य के रूप में /usr/local/include/soci का उपयोग करेगा पुस्तकालय फ़ाइलें

अब/usr/स्थानीय/शामिल अपने डिफ़ॉल्ट में होना चाहिए पथ शामिल (जैसे अपने को स्थापित करने का उपयोग करता है सूची देखने के लिए gcc -c -v -x c++ /dev/null -o /dev/null की तरह कुछ कोशिश) और इसलिए आप इन का उपयोग कर

शामिल कर सकते हैं
#include <soci/soci.h> 
#include <soci/soci-mysql.h> 

आपको फिर अपने लिंक चरण में पुस्तकालयों को जोड़ने की आवश्यकता है। ऐसा लगता है कि आपके पास पुस्तकालयों के स्थिर और साझा दोनों संस्करण होंगे। आपको अपने लिंक चरण में -lsoci_core -lsoci_mysql जोड़ने की आवश्यकता होगी; हालांकि यदि यह काम नहीं करता है तो आपको एक खोज निर्देशिका के रूप में/usr/local/lib को निर्दिष्ट करने की आवश्यकता होगी यानी -L/usr/local/lib -lsoci_core -lsoci_mysql। (फिर यह शायद पहले से ही है लेकिन आप gcc -print-search-dirs का उपयोग कर देख सकते हैं।) हालांकि, समस्या यह है कि यदि आप साझा संस्करण का उपयोग कर रहे हैं और/usr/local/lib आपके वितरण पुस्तकालय खोज पथ में नहीं है (देखें/etc/ld.so.conf और/या /etc/ld.so.conf.d/*) तो यह रनटाइम पर साझा लाइब्रेरी नहीं ढूंढ पाएगा। आपको लिंकर स्विच -rpath के साथ लाइब्रेरी के पथ में या तो हार्ड-कोड की आवश्यकता होगी या सिस्टम-वाइड सर्च पथ में पहले या आपके पर्यावरण में जोड़ें/usr/local/lib (वैरिएबल LD_LIBRARY_PATH) जोड़ें। मुझे यकीन नहीं है कि ऐसा करने का सबसे अच्छा तरीका क्या है - मैं सामान्य रूप से सिस्टम को संशोधित करने से बचने के लिए -rpath का सुझाव दूंगा, हालांकि यदि आप/usr/local/lib में बहुत से पुस्तकालयों का निर्माण कर रहे हैं तो इसे जोड़ने का अर्थ हो सकता है यह।

+0

लाइब्रेरी अपवाद को फेंक देती है "बैकएंड mysql के लिए साझा लाइब्रेरी ढूंढने में विफल" यहां तक ​​कि एक खोज निर्देशिका और -प्रैथ के रूप में/usr/local/lib निर्दिष्ट करते हैं, लेकिन मैं इसे तीन mysql बैकएंड की प्रतिलिपि बना सकता हूं। इसलिए फाइलें प्रोजेक्ट निर्देशिका में कॉपी करती हैं। धन्यवाद! – NeDark

+0

हम्म, मेरे पास यह गलत हो सकता है: यह संभव है कि आपको केवल '-lsoci_core' में लिंक करने की आवश्यकता हो और फिर यह mysql लाइब्रेरी को स्वयं ही dlopen करेगा? यह अजीब बात है कि यह लाइब्रेरी नहीं ढूंढ सकता है, हालांकि, यह ज्ञात होगा कि बिल्ड समय देखने के लिए/usr/local/lib जगह होगी। क्षमा करें, मैं विशेष रूप से कुछ भी बेहतर सुझाव देने के लिए समाज को नहीं जानता लेकिन खुश हूं कि आप इसे काम कर रहे हैं! – Rup

+0

नहीं, मैंने अभी कोशिश की है और यह -lsoci_mysql विकल्प के बिना काम नहीं करता है। मुझे नहीं पता क्यों, लेकिन समाज भी mysql बैकएंड लाइब्रेरी को dopopen करने के लिए प्रयास करता है। मुझे वह फ़ाइल मिली जहां Google पर प्रीवियस त्रुटि की खोज होती है: http://code.google.com/p/boost-soci/source/browse/trunk/libs/soci/src/backend-loader.cpp?r= 2 पीडी: क्या आप मुझे बता सकते हैं कि आपने टिप्पणियों पर "कोड टैग" कैसे रखा? – NeDark

2

मैं जब मैं निष्पादित session sql("mysql://db=...)

मैं (कम से कम मेरी उबंटू 11.04 पर) एक समाधान पाया एक ही मेरी सी ++ कार्यक्रम पर बैकएंड त्रुटि लोड नहीं करता मिला है। बस कार्य करें:

sudo -i ln -s /usr/lib/libsoci_mysql-gcc-3_0-3.0.0.so /usr/lib/libsoci_mysql.so 

यह प्रतीत उस फ़ाइल /usr/lib/libsoci_mysql.so के लिए समाज पुस्तकालय खोज है कि सिस्टम में नहीं है, अगर आप पुस्तकालय /usr/lib/libsoci_mysql-gcc-3_0-3.0.0.so है कि यह प्रणाली यह काम करता है में है के लिए एक लिंक बनाने के खरीद (मुझे लगता है कि Debian/उबंटू मूल नाम से फ़ाइल नाम बदलता है, लेकिन इसका साइड इफेक्ट्स है क्योंकि एसओसीआई लाइब्रेरी मूल नाम के अंदर खोज करती है)।

मुझे बैश पर्यावरण चर LD_DEBUG=files का उपयोग करके त्रुटि मिली और मेरी सी ++ बाइनरी चल रही है।

उम्मीद है कि यह मदद करता है।

+0

'निर्यात LD_DEBUG = फ़ाइलें' बहुत उपयोगी था, धन्यवाद। –