c++ - लिनक्स पर सी++ गतिशील साझा लाइब्रेरी




linux shared-libraries (2)

असल में, आपको उस कोड में 'हेडर फ़ाइल' श्रेणी शामिल करनी चाहिए जहां आप साझा लाइब्रेरी में कक्षा का उपयोग करना चाहते हैं। फिर, जब आप लिंक करते हैं, तो साझा कोड के साथ अपने कोड को लिंक करने के लिए '-l' ध्वज का उपयोग करें । बेशक, इसके लिए ओएसओ होना चाहिए जहां ओएस इसे ढूंढ सके। 3.5 देखें साझा लाइब्रेरी को स्थापित करना और उसका उपयोग करना

Dlsym का उपयोग करना तब होता है जब आप संकलित समय पर नहीं जानते कि आप किस लाइब्रेरी का उपयोग करना चाहते हैं। ऐसा लगता है कि यह मामला यहां नहीं है। हो सकता है कि भ्रम यह है कि विंडोज गतिशील रूप से लोड की गई लाइब्रेरी कहता है कि क्या आप संकलन या रन-टाइम (समान तरीकों के साथ) पर लिंक करते हैं? यदि ऐसा है, तो आप लोड लाइब्रेरी के बराबर के रूप में dlsym के बारे में सोच सकते हैं।

यदि आपको वास्तव में पुस्तकालयों को गतिशील रूप से लोड करने की आवश्यकता है (यानी, वे प्लग-इन हैं), तो इस FAQ को सहायता करनी चाहिए।

यह g ++ के साथ गतिशील साझा लाइब्रेरी संकलन का अनुवर्ती है।

मैं लिनक्स पर सी ++ में एक साझा कक्षा पुस्तकालय बनाने की कोशिश कर रहा हूं। मैं लाइब्रेरी को संकलित करने में सक्षम हूं, और मैं here और here पाए गए ट्यूटोरियल्स का उपयोग करके कुछ (गैर-वर्ग) फ़ंक्शंस को कॉल कर सकता हूं। मेरी समस्याएं तब शुरू होती हैं जब मैं लाइब्रेरी में परिभाषित कक्षाओं का उपयोग करने का प्रयास करता हूं। दूसरा ट्यूटोरियल जो मैंने लिंक किया है, दिखाता है कि पुस्तकालय में परिभाषित कक्षाओं की वस्तुओं को बनाने के लिए प्रतीकों को कैसे लोड किया जाए, लेकिन किसी भी काम को करने के लिए उन वस्तुओं का उपयोग करने से कम हो जाता है।

क्या किसी को साझा सी ++ वर्ग पुस्तकालय बनाने के लिए एक और पूर्ण ट्यूटोरियल पता है जो यह भी दिखाता है कि उन वर्गों को अलग निष्पादन योग्य तरीके से कैसे उपयोग किया जाए ? ऑब्जेक्ट सृजन, उपयोग (सरल गेटर्स और सेटर्स ठीक होंगे) का एक बहुत ही सरल ट्यूटोरियल, और हटाना शानदार होगा। एक लिंक या कुछ ओपन सोर्स कोड का संदर्भ जो साझा क्लास लाइब्रेरी के उपयोग को दर्शाता है, उतना ही अच्छा होगा।

हालांकि कोडेलोगिक और here के जवाब काम करते हैं, मैं बस यह जोड़ना चाहता था कि मैंने इस प्रश्न पूछने के बाद here की एक प्रति उठाई है, और इसके पहले अध्याय में सी कोड और स्थिर और साझा पुस्तकालयों का निर्माण और उपयोग करने के लिए अच्छी व्याख्या है । ये उदाहरण Google पुस्तक खोज के माध्यम से उस पुस्तक के पुराने संस्करण में उपलब्ध हैं।


निम्नलिखित साझा किए गए साझा क्लास लाइब्रेरी का एक उदाहरण दिखाता है। [H, cpp] और लाइब्रेरी का उपयोग करते हुए एक main.cpp मॉड्यूल। यह एक बहुत ही सरल उदाहरण है और मेकफ़ाइल को बेहतर बनाया जा सकता है। लेकिन यह काम करता है और आपकी मदद कर सकता है:

share.h कक्षा को परिभाषित करता है:

class myclass {
   int myx;

  public:

    myclass() { myx=0; }
    void setx(int newx);
    int  getx();
};

shared.cpp getx / setx फ़ंक्शंस को परिभाषित करता है:

#include "shared.h"

void myclass::setx(int newx) { myx = newx; }
int  myclass::getx() { return myx; }

main.cpp कक्षा का उपयोग करता है,

#include <iostream>
#include "shared.h"

using namespace std;

int main(int argc, char *argv[])
{
  myclass m;

  cout << m.getx() << endl;
  m.setx(10);
  cout << m.getx() << endl;
}

और मेकफ़ाइल जो libshared.so उत्पन्न करता है और साझा लाइब्रेरी के साथ मुख्य लिंक करता है:

main: libshared.so main.o
    $(CXX) -o main  main.o -L. -lshared

libshared.so: shared.cpp
    $(CXX) -fPIC -c shared.cpp -o shared.o
    $(CXX) -shared  -Wl,-soname,libshared.so -o libshared.so shared.o

clean:
    $rm *.o *.so

वास्तविक रन 'मुख्य' और libshared.so से लिंक करने के लिए आपको शायद लोड पथ निर्दिष्ट करने की आवश्यकता होगी (या इसे / usr / local / lib या इसी तरह में डालें)।

निम्नलिखित वर्तमान निर्देशिका को पुस्तकालयों के लिए खोज पथ के रूप में निर्दिष्ट करता है और मुख्य (बैश वाक्यविन्यास) चलाता है:

export LD_LIBRARY_PATH=.
./main

यह देखने के लिए कि प्रोग्राम libshared से जुड़ा हुआ है। तो आप ldd कोशिश कर सकते हैं:

LD_LIBRARY_PATH=. ldd main

मेरी मशीन पर प्रिंट:

  ~/prj/test/shared$ LD_LIBRARY_PATH=. ldd main
    linux-gate.so.1 =>  (0xb7f88000)
    libshared.so => ./libshared.so (0xb7f85000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7e74000)
    libm.so.6 => /lib/libm.so.6 (0xb7e4e000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb7e41000)
    libc.so.6 => /lib/libc.so.6 (0xb7cfa000)
    /lib/ld-linux.so.2 (0xb7f89000)




shared-libraries