2009-05-06 19 views
32

Tôi đang biên soạn một số mã sử dụng libcurl trên hệ thống Debian Linux. Máy dev của tôi đang chạy Debian 5 nhưng tôi muốn hệ nhị phân có thể sử dụng được trên các hệ thống Debian 4 cũ hơn.Làm thế nào để bạn liên kết đến một phiên bản cụ thể của một thư viện được chia sẻ trong GCC

Tôi thấy rằng nếu tôi chỉ định -lcurl nó sẽ liên kết đến libcurl.so.4 nhưng Debian 4 hệ thống chỉ có libcurl.so.3

Có một số cách tôi có thể nói GCC để liên kết đến một trong hai libcurl.so.3 (tồn tại trong cả Debian 4 và 5) hoặc chỉ libcurl.so để nó sử dụng bất kỳ phiên bản nào có sẵn?

+1

Trên Debian cũ hơn, không phải là libcurl.so là một liên kết tượng trưng đến libcurl.so.3? Tôi có nghĩa là, có vẻ lạ rằng -lcurl không phải là điều đúng theo mặc định. –

+0

kastauyra: các phiên bản không, hoặc ít nhất không thể được giả định là, tương thích nhị phân. Vì vậy, khi bạn liên kết nó ghi lại phiên bản chính liên quan đến trong nhị phân: nếu bạn biên dịch trên hệ thống mới hơn, nó sẽ yêu cầu phiên bản 4 và không hoạt động trên hệ thống cũ. (Trên thực tế những gì nó ghi là soname, mà là một chuỗi được lưu trữ trong tập tin thư viện mà thông thường nhưng không nhất thiết phải là một cái gì đó "libcurl.so.3") –

Trả lời

22

Bạn có thể chuyển tệp .so thực tế thay vì -l trên dòng lệnh trình liên kết và nó phải làm những gì bạn muốn.

+1

Ah, mà hầu như hoạt động ngoại trừ libcurl.so chỉ là một symlink để lubcurl.so.4 trên Debian và do đó nó vẫn liên kết đến libcurl.so.4. –

+0

Tôi sẽ đánh dấu phần này là câu trả lời được chấp nhận mặc dù nó không chính xác cho libcurl trên Debian 5. Những gì tôi đã làm là lấy bản sao của libcurl.so.3 từ hệ thống Debian 4 và liên kết trực tiếp đến đó bằng cách chỉ định. vì vậy tên tập tin như bdonlan đề xuất. –

1

Cách tạo liên kết tượng trưng cục bộ cho dự án của bạn liên kết đến .3, thì bạn chỉ có thể sử dụng -L lúc biên dịch. Tôi không chắc chắn nếu bạn muốn có được một cuộc xung đột tên mặc dù, nhưng bạn luôn có thể gọi nó là libcurl-old.so chỉ trong trường hợp.

53

Thay vì sử dụng "-lcurl" sử dụng "-l: libcurl.so.3" Và ofcourse cũng sử dụng "-L _installed_path_"

+0

cùng một vấn đề khi được liên kết với nhau. -l: libX.so liên kết đến libX.so.Y thay vì – Gregory

+1

Điều này không hiệu quả với tôi ngay cả với đường dẫn. ldd cho thấy nó liên kết với một điều. Đầu ra được liên kết hiển thị tên tệp chính xác. Nhưng strace xác nhận nó đang tải file.2 thay vì file.2.3 và nó không phải là một symlink. – jgmjgm

+0

Tôi bị cám dỗ để đánh dấu đây là câu trả lời. Bạn thực sự đã lưu lời nói của tôi @ engineer.udays – user5241806

0

Tôi nghĩ rằng cách chính xác để làm điều đó sẽ được sử dụng --filter--auxiliary cờ của trình liên kết.

Chúng không được ghi chép nhiều, nhưng sẽ cho phép bạn tải biểu tượng từ các phiên bản khác nhau của cùng một thư viện theo máy bạn đã cài đặt.

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