2012-04-05 19 views
15

का उपयोग करके एक सापेक्ष पथ के साथ गतिशील लाइब्रेरी को कैसे लिंक करें यदि आप गतिशील लिंकिंग को समझने की कोशिश कर रहे हैं, तो this question ब्याज की संभावना है।मैकोज़ - जीसीसी/एलडी

उस प्रश्न के उत्तर में से एक गतिशील पुस्तकालय बनाने और उपयोग करने का एक अद्भुत उदाहरण प्रदान करता है। यह आधार पर, मैं कुछ सरल फाइलें:

main.c:

extern void someFunction (int x); 

int main (int argc, char** argv) { 
    someFunction(666); 
} 

mylibrary.c:

#include <stdio.h> 

void someFunction (int x) { 
    printf ("\nsomeFunction called with x=%d\n", x); 
} 

makefile:

main: mylibrary.c main.c 
    gcc -c mylibrary.c 
    gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib 
    gcc -c main.c 
    gcc -v main.o ./libmylibrary.dylib -o main 

clean: 
    rm *.o 
    rm main 
    rm *.dylib 

अब तक, सब कुछ अच्छा काम करता है । अगर मैं बनाने के लिए और फिर कमांड प्रॉम्प्ट पर ./main दर्ज करते हैं, मैं उम्मीद उत्पादन देखें:

someFunction called with x=666 

अब, मैं एक छोटे से बातें मिश्रण करना चाहते हैं। मैंने एक निर्देशिका hidelib बनाया है, जो मेरी मुख्य निर्देशिका का एक उपनिर्देशिका है। और मैं अपने makefile के लिए एक लाइन जोड़ रहा:

main: mylibrary.c main.c 
    gcc -c mylibrary.c 
    gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib 
    gcc -c main.c 
    mv libmylibrary.dylib hidelib  # this is the new line 

clean: 
    rm *.o 
    rm main 
    rm hidelib/*.* 

अब, मैं makefile के लिए एक और लाइन जोड़ना चाहते हैं तो यह hidelib उपनिर्देशिका में libmylibrary.dylib मिल जाएगा। मैं उसी तरह से //ain चलाने में सक्षम होना चाहता हूं। मैं उसे कैसे कर सकता हूँ?

संपादित करें: प्रतिक्रिया के लिए धन्यवाद। बहुत सारे विकल्प होने के कारण अद्भुत है, लेकिन शुरुआत करने वाला एक कंक्रीट विकल्प चाहता है जो काम करता है। यहां मैं आखिरी पंक्ति के लिए कोशिश कर रहा हूं, लेकिन स्पष्ट रूप से मुझे कुछ समझ में नहीं आता है। मेकफ़ाइल त्रुटियों के बिना निष्पादित करता है, लेकिन रनटाइम पर यह कहता है "लाइब्रेरी नहीं मिली।"

gcc main.o -rpath,'$$ORIGIN/hidelib' -lmylibrary -o main 

उत्तर

13

.dylib को लिंक करते समय install_name ध्वज सेट करने के लिए एक ठोस विकल्प होगा।

gcc -dynamiclib -install_name '$(CURDIR)/hidelib/libmylibrary.dylib' -current_version 1.0 mylibrary.o -o libmylibrary.dylib 

तो आप सामान्य रूप से पुस्तकालय के लिए सिर्फ लिंक कर सकते हैं:

gcc main.o -L '$(CURDIR)/hidelib' -lmylibrary -o main 
7

आप शायद -L संकलक/लिंकर ध्वज जो पुस्तकालयों के लिए खोज पथ के लिए कहते हैं की जरूरत है।

लिंक करने के बाद चीजों को स्थानांतरित करने की कोशिश कर रहे हैं, तो आपको खोज के लिए dyld पर्यावरण चर की आवश्यकता होगी। man dyld और आपको DYLD_LIBRARY_PATH और अन्य पर्यावरण चर पर अधिक जानकारी प्राप्त करने में सक्षम होना चाहिए।

आमतौर पर है, हालांकि, आप पुस्तकालय के नाम को स्थापित करने के लिए कुछ मूल्य के रूप में @rpath/mylibrary.dylib की तरह कुछ करने के लिए -install_name लिंकर ध्वज के साथ लिंक करने से पहले निर्धारित करते हैं, तो मुख्य निष्पादन पर रन पथ खोज पथ सेट -rpath ध्वज के साथ संयोजित करते समय @executable_path/hidelib पर।

अधिक जानकारी के लिए install_name_tool देख सकते हैं और ld की -rpath & -install_name तर्क।

असल में, आप जो करने की कोशिश कर रहे हैं उसके लिए बहुत सारे विकल्प हैं।

संबंधित मुद्दे