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

标签 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库目录下的任何东西。我想出了在不设置 LD_LIBRARY_PATH 的情况下使用 -L-R 选项编译我的程序并且它工作正常。 (我注意到如果不设置 -R 选项它就不会工作)但是编译后的程序一直链接到 /usr/local/ssl/lib/libssl.so.0.9.8 而不是 /.../libssl.so.1.0.0。有解决办法吗?

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

任何帮助将不胜感激!

禅宗

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

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

最佳答案

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

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 查看更多信息.

关于c - 如何在不使用 LD_LIBRARY_PATH 的情况下链接 makefile 中共享库的特定版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384897/

相关文章:

certificate - 如何从文件中确定证书类型

c - 如何从链表中删除第一个节点? (C)

c - 尝试在 C 中打印文件的每一行

c - 这是删除 C 中链表的正确方法吗?

c++ - Linux 中的 InternetCombineUrlW 和 InternetCanonicalizeUrlW

c++ - MinGW 作为可靠的 64 位 GCC 编译器

C - 如何读取屏幕像素的颜色(快速)? (在 Windows 中)

c++ - 使用标准 C++ 库调试符号? Ubuntu/Linux/libstdc++6-8-dbg?

linux - 安装 phpMyAdmin 时出错 - 需要 openssl10

php - iOS 推送通知发送错误