আপনি গতিশীল লিংকটিকে কোথায় দেখতে হবে তা জানাতে 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");
}
, hello.c:
#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>
linker পতাকা করার জন্য (এখানে সেটিংস এর দ্বারা 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
আমার মেশিনে খালি :(