【问题标题】:How to link a specific version of a shared library in makefile without using LD_LIBRARY_PATH?如何在不使用 LD_LIBRARY_PATH 的情况下在 makefile 中链接特定版本的共享库?
【发布时间】:2011-03-24 00:43:03
【问题描述】:

我知道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 选项仅在编译时“加载”共享库吗?

任何帮助将不胜感激!

禅宗

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

【问题讨论】:

    标签: c gcc openssl shared-libraries


    【解决方案1】:

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

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

    【讨论】:

    • 我发现对于 gcc -l: 不起作用,但它也不会产生错误并且仍然尝试链接到某些东西。
    【解决方案2】:

    您有任何指向 SSL 库的链接吗? 如果没有,您能否创建一个指向所需 SSL 库的链接,例如

    ln -s libssl.so.1.0.0 libssl.so 
    

    在ssl目录下试试

    【讨论】:

    • 是的,符号链接是一个很好的方法,但有时我需要链接到旧版本的 openssl 库。我想要每次编译程序时都可以更改的东西。但是谢谢,它有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多