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
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