Я знаю, что LD_LIBRARY_PATH является злым, и это - хорошая привычка избегать использования его. Мне назвали программу server.c
на удаленном Солярисе 9 серверов, которые содержат две версии openssl библиотеки (0.9.8 и 1.0.0) и я использую gcc 3.4.6. Моя потребность программы связаться с 1.0.0a версия. Поскольку это - рабочая среда, я не имею права изменить что-либо в openssl каталоге библиотеки. Я выяснил для компиляции моей программы с обоими -L
и -R
опции без установки LD_LIBRARY_PATH
и это хорошо работало. (Я заметил, что это не будет работать без установки -R
опция), Но скомпилированная программа продолжала связываться с /usr/local/ssl/lib/libssl.so.0.9.8
вместо /.../libssl.so.1.0.0
. Существует ли обходное решение для этого?
BTW, исправьте меня, если я неправ: действительно ли это -R
опция, которые на самом деле "связывают" общие библиотеки во времени выполнения и -L
опция только "загружает" совместно использованные библиотеки во время компиляции?
Любая справка будет очень цениться!
Z.Zen
//////////////////////////////////////////////
Вот мой Make-файл:
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
Я понял, что могу включить абсолютный путь к конкретной библиотеке, на которую хочу создать ссылку, и у меня это сработало:
LD = ${RPATH} -lsocket -lnsl -lpthread ${OPENSSLDIR}/lib/libssl.so.1.0.0 \
${OPENSSLDIR}/lib/libcrypto.so.1.0.0
Если вы используете g ++ , Piotr Lesnicki указал, что -l: libssl.so.1.0.0
также работает. См. Дополнительную информацию в исходном сообщении .
Есть ли у вас ссылки на библиотеку SSL? Если нет, можете ли вы создать ссылку на желаемую библиотеку SSL, например
ln -s libssl.so.1.0.0 libssl.so
в каталоге ssl, и попробовать ее