2010-08-02 46 views
9

我知道LD_LIBRARY_PATH is evil,避免使用它是個好習慣。 我有一個程序叫做server.c在一個遠程Solaris 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。有沒有解決這個問題的方法?如何在不使用LD_LIBRARY_PATH的情況下鏈接makefile中特定版本的共享庫?

順便說一句,請糾正我,如果我錯了:它是-R選項,實際上「鏈接」運行時的共享庫和-L選項只有在編譯時「加載」共享庫?

任何幫助將不勝感激!

Z.Zen

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

這裏是我的的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 

回答

15

我想通了,我可以包括特定庫的絕對路徑,我要鏈接到它爲我工作得很好:

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

我發現對於gcc -l:不起作用,但它也不會產生錯誤,並且仍然嘗試鏈接到某個東西。 – jgmjgm 2015-11-09 11:14:06

1

你有到SSL lib中的任何鏈接? 如果沒有,你能在SSL目錄創建一個類似

ln -s libssl.so.1.0.0 libssl.so 

鏈接到所需的SSL lib和嘗試

+0

是的,符號鏈接是一個很好的方法來做到這一點,但有時我需要鏈接到舊版本的openssl庫。我希望每次編譯我的程序時都能改變它。但是,謝謝,它的作品! – 2010-08-03 02:50:10

相關問題