如何在不使用LD_LIBRARY_PATH的情况下链接makefile中特定版本的共享库?

时间:2010-08-02 04:00:01

标签: c gcc openssl shared-libraries

我知道LD_LIBRARY_PATH is evil并且避免使用它是一个好习惯。 我在远程Solaris 9服务器上有一个名为server.c的程序,它包含两个版本的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。有解决办法吗?

顺便说一句,如果我错了,请纠正我:是-R选项在运行时实际“链接”共享库而-L选项只在编译时“加载”共享库吗?

非常感谢任何帮助!

Z.Zen

////////////////////////////////////////////// < / p>

这是我的 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

2 个答案:

答案 0 :(得分:16)

我发现我可以包含我要链接到的特定库的绝对路径,它对我来说很好用:

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也有效。请参阅original post

答案 1 :(得分:1)

您是否有任何SSL lib链接? 如果没有,您是否可以创建指向所需SSL库的链接,如

ln -s libssl.so.1.0.0 libssl.so 

在ssl目录中并尝试