2010-08-02 12 views
9

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 

Odpowiedz

15

Pomyślałem, że mogę to bezwzględną ścieżkę konkretnej biblioteki, że aby połączyć się i to działało dobrze dla mnie:

LD = ${RPATH} -lsocket -lnsl -lpthread ${OPENSSLDIR}/lib/libssl.so.1.0.0 \ 
     ${OPENSSLDIR}/lib/libcrypto.so.1.0.0 

Jeśli używasz g ++, Piotr Lesnicki wskazał, że -l:libssl.so.1.0.0 działa również. Zobacz więcej na original post.

+1

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

1

Czy macie jakieś linki do lib SSL? Jeśli nie, możesz utworzyć link do żądanego lib SSL jak

ln -s libssl.so.1.0.0 libssl.so 

w katalogu ssl i spróbować

+0

Tak, dowiązanie symboliczne to dobry sposób, ale czasami muszę połączyć ze starszą wersją biblioteki openssl. Chcę czegoś, co mogę zmienić za każdym razem, gdy skompiluję program. Ale dzięki, to działa! –

Powiązane problemy