Thêm đường dẫn đến nơi đặt thư viện mới của bạn LD_LIBRARY_PATH
(nó có tên hơi khác trên Mac ...)
Giải pháp của bạn sẽ hoạt động với việc sử dụng các -L/my/dir -lfoo
tùy chọn, trong thời gian chạy, hãy sử dụng LD_LIBRARY_PATH để trỏ đến vị trí thư viện của bạn.
Cẩn thận với việc sử dụng LD_LIBRARY_PATH - trong ngắn hạn (từ liên kết):
..implication ..:
Security : Hãy nhớ rằng các thư mục được chỉ định trong LD_LIBRARY_PATH được tìm kiếm trước (!) các vị trí tiêu chuẩn? Bằng cách đó, một kẻ xấu có thể khiến ứng dụng của bạn tải một phiên bản của thư viện được chia sẻ có chứa mã độc hại! Đó là một lý do tại sao các tệp thực thi setuid / setgid lại bỏ qua biến đó!
Hiệu suất: Trình tải liên kết phải tìm kiếm tất cả các thư mục được chỉ định, cho đến khi nó tìm thấy thư mục chứa thư viện được chia sẻ - đối với TẤT CẢ các thư viện được chia sẻ, ứng dụng được liên kết với! Điều này có nghĩa là rất nhiều lệnh gọi hệ thống để mở (), sẽ không thành công với "ENOENT (Không có tệp hoặc thư mục như vậy)"! Nếu đường dẫn chứa nhiều thư mục, số lần gọi thất bại sẽ tăng lên một cách tuyến tính và bạn có thể biết điều đó ngay từ thời điểm khởi động ứng dụng. Nếu một số (hoặc tất cả) thư mục nằm trong môi trường NFS, thời gian khởi động ứng dụng của bạn thực sự có thể kéo dài - và nó có thể làm chậm toàn bộ hệ thống!
Không nhất quán: Đây là vấn đề phổ biến nhất. LD_LIBRARY_PATH buộc ứng dụng tải một thư viện được chia sẻ mà nó không được liên kết và điều đó có khả năng không tương thích với phiên bản gốc. Điều này có thể rất rõ ràng, tức là ứng dụng bị treo, hoặc nó có thể dẫn đến kết quả sai, nếu thư viện được chọn không thực hiện đúng như những gì phiên bản gốc đã làm. Đặc biệt là sau này đôi khi khó gỡ lỗi.
HOẶC LÀ
Sử dụng tùy chọn rpath qua gcc đến trình liên kết - đường dẫn tìm kiếm thư viện thời gian chạy, sẽ được sử dụng thay vì tìm kiếm trong dir tiêu chuẩn (tùy chọn gcc):
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
Điều này là tốt cho một giải pháp tạm thời. Đầu tiên, trình liên kết tìm kiếm thư viện LD_LIBRARY_PATH trước khi xem xét các thư mục chuẩn.
Nếu bạn không muốn cập nhật vĩnh viễn LD_LIBRARY_PATH, bạn có thể thực hiện việc này nhanh chóng trên dòng lệnh:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
Bạn có thể kiểm tra những gì trình liên kết thư viện biết về việc sử dụng (ví dụ):
/sbin/ldconfig -p | grep libpthread
libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
Và bạn có thể kiểm tra thư viện mà ứng dụng của bạn đang sử dụng:
ldd foo
linux-gate.so.1 => (0xffffe000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000)
librt.so.1 => /lib/librt.so.1 (0xb7e65000)
libm.so.6 => /lib/libm.so.6 (0xb7d5b000)
libc.so.6 => /lib/libc.so.6 (0xb7c2e000)
/lib/ld-linux.so.2 (0xb7fc7000)
libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000)
libz.so.1 => /lib/libz.so.1 (0xb7c18000)
libfoo.*
tập tin tồn tại và ở đâu -.so
w / o.0
,.a
, vv vv?