2009-12-19 11 views
7

पर सी में एक dlopen() एड गतिशील लाइब्रेरी से मुख्य प्रोग्राम वैश्विक चर तक पहुंचने के लिए मैं small application रख रहा हूं जिसमें कुछ प्लगइन जैसी कार्यक्षमता है, जिसे रनटाइम-लोड गतिशील मॉड्यूल के माध्यम से कार्यान्वित किया गया है।ओएस एक्स

विशेष रूप से, चूंकि यह एक जीटीके + ऐप है, इसलिए मैं gmodule का उपयोग कर रहा हूं, लेकिन सवाल dlfcn.h/dlopen() आधारित गतिशील लाइब्रेरी लोडिंग पर भी लागू होता है।

मेरा मुख्य कार्यक्रम एक वैश्विक, वैश्विक संरचना चर है जिसमें कुछ वैश्विक जानकारी है। मैं चाहता हूं कि यह जानकारी गतिशील रूप से लोड किए गए प्लगइन में परिभाषित कार्यों के लिए उपलब्ध हो।

लिनक्स पर, मैं सीधे इस वैश्विक चर को संदर्भित कर सकता हूं - यह अच्छी तरह से काम करता है, और मुझे लगता है कि जीसीसी या लिंकर मुख्य कार्यक्रम से गतिशील पुस्तकालयों तक वैश्विक चर निर्यात करने का ख्याल रखता है।

समस्या यह है कि यह मैक ओएस एक्स पर काम नहीं करता है। क्या ओएस एक्स पर ऐसा करने का कोई तरीका है?

यदि नहीं, तो गतिशील रूप से लोड की गई लाइब्रेरीज़ को वैश्विक जानकारी का खुलासा करने के लिए एक और "सर्वोत्तम अभ्यास" तरीका है?

+0

बीटीडब्ल्यू यहां कुछ उदाहरण कोड है जो समस्या को सरल बनाता है: http://pastie.org/749794 – shevron

उत्तर

10

main.c में वैश्विक रखो और साझा वस्तु में निर्वासन यह ऐलान करते हैं और कोशिश यह:

MACOSX_DEPLOYMENT_TARGET=10.3 ld -dylib -undefined dynamic_lookup -o multiply.so multiply.o 

या

MACOSX_DEPLOYMENT_TARGET=10.3 libtool -dynamic -undefined dynamic_lookup -o multiply.so multiply.o 

यह मैक ओएस एक्स पर 10.4

मेरे लिए काम किया
+0

धन्यवाद, यह काम करता है! मैंने TAGET पर्यावरण var का उपयोग नहीं किया, हालांकि, मुझे लगता है कि यह कम संबंधित है। अब यह देखने के लिए कि मेरे मेकफ़ाइल में इसे कैसे एकीकृत किया जाए! – shevron

+0

यह gcc से निर्देशिका भी काम करता है: gcc -Wall -g -fPIC -c multiply.c gcc -shared -Wl, -undefined, dynamic_lookup -o multiply.so multiply.o – shevron

3

जब से तुम

int global; 
multiply.h शीर्षक में

घोषित, DLL और मुख्य कार्यक्रम दोनों इसके बारे में अपने स्वयं के प्रति है। इसके बजाय, main.c में वैश्विक घोषित

int global; 

और multiply.c में निर्वासन के रूप में यह घोषणा करते हैं:

extern int global; 

अब अगर आप -rdynamic विकल्प के साथ main.cpp लिंक, तो निष्पादन के प्रतीकों डीएलएल को निर्यात किया जाएगा।

मैंने लिनक्स के तहत इसका परीक्षण किया और यह काम किया, लेकिन मुझे डर है कि मैकोज़ पर परीक्षण तक पहुंच नहीं है। चूंकि आपका नमूना कोड लिनक्स पर भी काम नहीं करता है, इसलिए मुझे उम्मीद है कि यह समस्या थी।

+0

AFAIK- ओएस एक्स पर गतिशील समर्थित नहीं है। किसी भी मामले में मुझे लिंक करने का प्रयास करते समय "_global" को अपरिभाषित करने में त्रुटि मिली multiply.o – shevron