2010-08-02 18 views
9

Tôi biết rằng LD_LIBRARY_PATH is evil và đó là một thói quen tốt để tránh sử dụng nó. Tôi có một chương trình gọi là server.c trên máy chủ Solaris 9 từ xa chứa hai phiên bản của thư viện openssl (0.9.8 và 1.0.0) và tôi đang sử dụng gcc 3.4.6. Chương trình của tôi cần liên kết đến phiên bản 1.0.0a. Bởi vì nó là môi trường làm việc, tôi không có quyền sửa đổi bất cứ điều gì trong thư mục openssl library. Tôi đã tìm ra để biên dịch chương trình của mình với cả hai tùy chọn -L-R mà không cần đặt LD_LIBRARY_PATH và nó hoạt động tốt. (Tôi nhận thấy nó sẽ không hoạt động mà không cần thiết lập tùy chọn -R) Nhưng chương trình được biên dịch liên tục giữ liên kết đến /usr/local/ssl/lib/libssl.so.0.9.8 thay vì /.../libssl.so.1.0.0. Có một cách giải quyết cho điều này?Làm cách nào để liên kết phiên bản cụ thể của thư viện được chia sẻ trong tệp makefile mà không sử dụng LD_LIBRARY_PATH?

BTW, vui lòng sửa tôi nếu tôi sai: có phải tùy chọn -R thực sự "liên kết" các thư viện được chia sẻ khi chạy và -L chỉ tùy chọn "tải" thư viện được chia sẻ lúc biên dịch không?

Mọi trợ giúp sẽ được đánh giá cao!

Z.Zen

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

đây là tôi 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 

Trả lời

15

tôi đã tìm ra rằng tôi có thể bao gồm các đường dẫn tuyệt đối của thư viện cụ thể mà tôi muốn liên kết đến và nó làm việc tốt cho tôi:

LD = ${RPATH} -lsocket -lnsl -lpthread ${OPENSSLDIR}/lib/libssl.so.1.0.0 \ 
     ${OPENSSLDIR}/lib/libcrypto.so.1.0.0 

Nếu bạn đang sử dụng g ++, Piotr Lesnicki chỉ ra rằng -l:libssl.so.1.0.0 cũng làm việc. Xem thêm tại original post.

+1

Tôi thấy rằng đối với gcc -l: không hoạt động, nhưng nó cũng sẽ không tạo ra lỗi và vẫn cố liên kết đến một thứ gì đó. – jgmjgm

1

bạn có bất cứ liên kết đến các lib SSL? Nếu không, bạn có thể tạo một liên kết đến các lib SSL mong muốn như

ln -s libssl.so.1.0.0 libssl.so 

trong thư mục ssl và thử nó

+0

vâng, liên kết tượng trưng là một cách hay để thực hiện nhưng đôi khi tôi cần liên kết đến phiên bản cũ hơn của thư viện openssl. Tôi muốn một cái gì đó mà tôi có thể thay đổi mỗi khi tôi biên dịch chương trình của mình. Nhưng cảm ơn, nó hoạt động! –

Các vấn đề liên quan