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
và -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
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