का उपयोग करके एक सापेक्ष पथ के साथ गतिशील लाइब्रेरी को कैसे लिंक करें यदि आप गतिशील लिंकिंग को समझने की कोशिश कर रहे हैं, तो 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