2010-08-02 3 views
9

Ich weiß, dass LD_LIBRARY_PATH is evil und es ist eine gute Gewohnheit, es zu vermeiden. Ich habe ein Programm namens server.c auf einem Remote-Solaris-9-Server, der zwei Versionen der OpenSSL-Bibliothek (0.9.8 und 1.0.0) enthält, und ich benutze gcc 3.4.6. Mein Programm muss mit der Version 1.0.0a verlinkt sein. Da es sich um eine Arbeitsumgebung handelt, habe ich nicht das Recht, etwas im Bibliotheksverzeichnis openssl zu ändern. Ich habe herausgefunden, mein Programm mit -L und -R Optionen ohne Einstellung LD_LIBRARY_PATH zu kompilieren und es hat gut funktioniert. (Ich habe festgestellt, dass es ohne die Einstellung -R Option nicht funktionieren wird) Aber das kompilierte Programm verlinkt zu /usr/local/ssl/lib/libssl.so.0.9.8 statt /.../libssl.so.1.0.0. Gibt es dafür einen Workaround?Wie Verknüpfen einer bestimmten Version einer gemeinsam genutzten Bibliothek in Makefile ohne Verwendung von LD_LIBRARY_PATH?

BTW, bitte korrigieren Sie mich, wenn ich falsch liege: Ist es die -R Option, die tatsächlich die gemeinsam genutzten Bibliotheken zur Laufzeit "verknüpfen" und -L Option nur "shared" Bibliotheken zur Kompilierzeit "laden"?

Jede Hilfe wird sehr geschätzt!

Z.Zen

/////////////////////////////////////// ///////

Hier ist meine 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 

Antwort

15

Ich fand heraus, dass ich den absoluten Pfad der spezifischen Bibliothek enthalten kann, dass ich wollen verbinden und es funktionierte gut für mich:

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

Wenn Sie g ++ verwenden, Piotr Lesnicki wies darauf hin, dass -l:libssl.so.1.0.0 auch funktioniert. Weitere Informationen finden Sie unter original post.

+1

Ich finde, dass für gcc-l: nicht funktioniert, aber es wird auch keinen Fehler erzeugen und immer noch versucht, mit etwas zu verknüpfen. – jgmjgm

1

haben Sie auf die SSL-lib alle Links haben? Wenn nicht, können Sie einen Link zu dem gewünschten SSL lib wie

ln -s libssl.so.1.0.0 libssl.so 

im ssl-Verzeichnis erstellen und versuchen, es

+0

Ja, symlink ist ein guter Weg, es zu tun, aber manchmal muss ich auf ältere Version der OpenSSL-Bibliothek verlinken. Ich möchte etwas, das ich jedes Mal ändern kann, wenn ich mein Programm kompiliere. Aber danke, es funktioniert! –