इस परिदृश्य पर विचार करें:
- साझा पुस्तकालय libA.so, कोई निर्भरता के साथ।
- साझा पुस्तकालय libB.so, libA.so के साथ इसकी निर्भरता के रूप में।
मैं एक बाइनरी फ़ाइल संकलित करना चाहता हूं जो कि libB के साथ लिंक करती है। क्या मुझे बाइनरी को केवल libB के साथ या liba के साथ जोड़ना चाहिए?
क्या केवल प्रत्यक्ष निर्भरता के साथ लिंक करने का कोई तरीका है, जिससे रनटाइम के लिए निर्भरता से अनसुलझे प्रतीकों का समाधान हो सके?
मैं इस तथ्य के बारे में चिंतित हूं कि भविष्य में पुस्तकालय libB कार्यान्वयन बदल सकता है, उदाहरण के लिए अन्य निर्भरताएं (libC, libD, libE)। क्या मुझे इससे कोई समस्या है?
दूसरे शब्दों में:
- libA फ़ाइलें: a.cpp आह
- libB फाइलें: b.cpp bh
- मुख्य कार्यक्रम की फाइलें: main.cpp
बेशक, b.cpp में आह शामिल है और main.cpp में bh शामिल है
संकलन आदेश:
g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o
g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA
मुझे किस विकल्प का उपयोग करना चाहिए?
g++ main.cpp -o main -I. -L. -lB
या
g++ main.cpp -o main -I. -L. -lB -lA
मैं पहले विकल्प का उपयोग नहीं कर सका। लिंकर पुस्तकालय लायब्रेरी से अनसुलझे प्रतीकों के बारे में शिकायत करता है। लेकिन यह मुझे थोड़ा अजीब लगता है।
बहुत बहुत धन्यवाद।
- अद्यतित टिप्पणियाँ:
जब मैं बाइनरी लिंक करता हूं, तो लिंकर मुख्य और libB से सभी प्रतीकों को हल करने का प्रयास करेगा। हालांकि, libB ने liba से अपरिभाषित प्रतीक हैं। इसलिए लिंकर उस बारे में शिकायत करता है।
इसलिए मुझे लिबास से भी जुड़ना होगा। हालाँकि मुझे साझा पुस्तकालयों से अनसुलझे प्रतीकों को अनदेखा करने का एक तरीका मिला। ऐसा लगता है कि मुझे निम्नलिखित कमांड लाइन का उपयोग करना चाहिए:
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
ऐसा लगता है कि -rpath
विकल्प का उपयोग करना अभी भी संभव है । हालांकि मुझे इसे थोड़ा बेहतर समझने की जरूरत है।
क्या कोई -Wl,-unresolved-symbols=ignore-in-shared-libs
विकल्प का उपयोग करते समय किसी भी संभावित नुकसान को जानता है?
- अपडेट किया गया 2:
-rpath
इस उद्देश्य के लिए उपयोग नहीं किया जाना चाहिए। किसी दिए गए डायरेक्टरी में लाइब्रेरी को खोजने के लिए बाध्य करना उपयोगी है। -unresolved-symbol
दृष्टिकोण बहुत बेहतर लग रहा है।
एक बार फिर धन्यवाद।