जब आप डायनामिक लिंकर को यह बताने के लिए LD_LIBRARY_PATH सेट कर सकते हैं कि कहाँ देखना है, तो बेहतर विकल्प हैं। आप अपनी साझा लाइब्रेरी को मानक स्थानों में से एक में रख सकते हैं, देखें /etc/ld.so.conf
(लिनक्स पर) और /usr/bin/crle
(सोलारिस पर) इन स्थानों की सूची के लिए
-R <path>
अपने बाइनरी का निर्माण करते समय आप लिंकर को पास कर सकते हैं , जो <path>
आपके साझा पुस्तकालय के लिए स्कैन की गई निर्देशिकाओं की सूची में जोड़ देगा । यहाँ एक उदाहरण है। सबसे पहले, समस्या दिखाते हुए:
libtest.h:
void hello_world(void);
libtest.c:
#include <stdio.h>
void hello_world(void) {
printf("Hello world, I'm a library!\n");
}
नमस्ते सी:
#include "libtest.h"
int main(int argc, char **argv) {
hello_world();
}
मेकफाइल (टैब का उपयोग किया जाना चाहिए):
all: hello
hello: libtest.so.0
%.o: %.c
$(CC) $(CFLAGS) -fPIC -c -o $@ $<
libtest.so.0.0.1: libtest.o
$(CC) -shared -Wl,-soname,libtest.so.0 -o libtest.so.0.0.1 libtest.o
libtest.so.0: libtest.so.0.0.1
ln -s $< $@
clean:
rm -f hello libtest.o hello.o libtest.so.0.0.1 libtest.so.0
चलो इसे चलाते हैं:
$ make
cc -fPIC -c -o libtest.o libtest.c
cc -shared -Wl,-soname,libtest.so.0 -o libtest.so.0.0.1 libtest.o
ln -s libtest.so.0.0.1 libtest.so.0
cc hello.c libtest.so.0 -o hello
$ ./hello
./hello: error while loading shared libraries: libtest.so.0: cannot open shared object file: No such file or directory
इसे कैसे जोड़ेंगे? -R <path>
लिंकर झंडे में जोड़ें (यहां, सेटिंग करके LDFLAGS
)।
$ make clean
(...)
$ make LDFLAGS="-Wl,-R -Wl,/home/maciej/src/tmp"
(...)
cc -Wl,-R -Wl,/home/maciej/src/tmp hello.c libtest.so.0 -o hello
$ ./hello
Hello world, I'm a library!
बाइनरी को देखते हुए, आप देख सकते हैं कि इसकी आवश्यकता है libtest.so.0
:
$ objdump -p hello | grep NEEDED
NEEDED libtest.so.0
NEEDED libc.so.6
बाइनरी अपने पुस्तकालयों के लिए, मानक निर्देशिका के अलावा, निर्दिष्ट निर्देशिका में देखेगा:
$ objdump -p hello | grep RPATH
RPATH /home/maciej/src/tmp
यदि आप बाइनरी को वर्तमान निर्देशिका में देखना चाहते हैं, तो आप RPATH को सेट कर सकते हैं $ORIGIN
। यह थोड़ा मुश्किल है, क्योंकि आपको यह सुनिश्चित करने की आवश्यकता है कि डॉलर के संकेत की व्याख्या मेक द्वारा नहीं की गई है। यहाँ यह करने का एक तरीका है:
$ make CFLAGS="-fPIC" LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"
$ objdump -p hello | grep RPATH
RPATH $ORIGIN
$ ./hello
Hello world, I'm a library!
echo $LD_LIBRARY_PATH
मेरी मशीन पर खाली है :(