Wiem, że LD_LIBRARY_PATH is evil i jest to dobry zwyczaj, aby tego uniknąć. Mam program o nazwie server.c
na zdalnym serwerze Solaris 9, który zawiera dwie wersje biblioteki openssl (0.9.8 i 1.0.0) i używam gcc 3.4.6. Mój program musi linkować do wersji 1.0.0a. Ponieważ jest to środowisko pracy, nie mam uprawnień do modyfikacji czegokolwiek w katalogu biblioteki openssl. Stwierdziłem, że mogę skompilować mój program z opcjami -L
i -R
bez ustawienia LD_LIBRARY_PATH
i wszystko działało bez zarzutu. (Zauważyłem, że nie zadziała bez ustawienia opcji -R
). Jednak skompilowany program nadal łączył się z /usr/local/ssl/lib/libssl.so.0.9.8
zamiast z /.../libssl.so.1.0.0
. Czy istnieje jakieś obejście tego problemu?Jak powiązać określoną wersję biblioteki współużytkowanej w makefile bez użycia LD_LIBRARY_PATH?
BTW, proszę mnie poprawić, jeśli się mylę: czy jest to opcja -R
, która faktycznie "łączy" biblioteki współdzielone w czasie wykonywania i -L
tylko opcję "wczytuj" udostępnione biblioteki w czasie kompilacji?
Każda pomoc będzie doceniona!
Z.Zen
/////////////////////////////////////// ///////
Oto moja Makefile:
CC = gcc
OPENSSLDIR = /usr/local/ssl
CFLAGS = -g -Wall -W -I${OPENSSLDIR}/include -O2 -D_REENTRANT -D__EXTENSIONS__
RPATH = -R${OPENSSLDIR}/lib
LD = ${RPATH} -L${OPENSSLDIR}/lib -lssl -lcrypto -lsocket -lnsl -lpthread
OBJS = common.o
PROGS = server
all: ${PROGS}
server: server.o ${OBJS}
${CC} server.o ${OBJS} -o server ${LD}
clean:;
${RM} ${PROGS} *.ln *.BAK *.bak *.o
Uważam, że dla gcc -l: nie działa, ale nie będzie również powodować błąd i nadal próbuje link do czegoś. – jgmjgm