2012-11-22 24 views
22

tôi có cảnh báo sau đây trong liên kết:Loại bỏ "gcc -/usr/bin/ld: không tìm thấy cảnh báo lib"

/usr/bin/ld: warning: libxxx.so.6, needed by /a/b/c/libyyy.so, not found (try using -rpath or -rpath-link) 

Thiết biến môi trường LD_LIBRARY_PATH = path_to_libxxx.so.6 im lặng cảnh báo (thêm -Lpath_to_libxxx.so.6 không có ích).

Tôi có một máy chủ biên dịch riêng biệt, trong đó nhị phân kết quả chỉ biên dịch. Hệ nhị phân được thực thi trên máy chủ khác và có libxxx.so.6 được xem bởi nhị phân (được kiểm tra với ldd executable).

Có cách nào khác để loại bỏ cảnh báo lúc biên dịch không (tôi có nhiều lần và rất khó chịu)?

+0

Hãy làm rõ câu hỏi của bạn. Điều gì sẽ xảy ra khi bạn biên dịch và liên kết chương trình, và điều gì sẽ xảy ra khi bạn cố chạy nó. –

+0

@NikosC. Làm rõ trong câu hỏi – dimba

Trả lời

30

Bạn cần phải thêm thư viện tương đương năng động của -L:

-Wl,-rpath-link,/path/to/lib 

Điều này sẽ gây ra các mối liên kết để tìm kiếm các thư viện chia sẻ ở những nơi phi tiêu chuẩn, nhưng chỉ với mục đích xác minh liên kết là đúng.

Nếu bạn muốn chương trình để tìm các thư viện tại địa điểm đó tại thời gian chạy, sau đó là một lựa chọn tương tự để làm điều đó:

-Wl,-rpath,/path/to/lib 

Nhưng, nếu chương trình của bạn chạy tốt mà không có điều này thì bạn không cần nó.

4

Đảm bảo rằng đường dẫn đến các thư viện cần thiết được biết đến với trình liên kết thời gian chạy. Điều này được thực hiện bằng cách thêm một tập tin trong /etc/ld.so.conf.d/ với đường dẫn cần thiết. Ví dụ, /etc/ld.so.conf.d/foo với các nội dung sau:

/usr/local/lib/foo/ 

Nếu bạn có một phiên bản Linux rất cũ, /etc/ld.so.conf.d/ có thể không được được hỗ trợ, trong trường hợp này bạn có thể phải thêm các đường dẫn trực tiếp vào tệp /etc/ld.so.conf.

Sau khi bạn đã thực hiện điều đó, bạn cần phải cập nhật cơ sở dữ liệu của trình liên kết bằng cách thực hiện lệnh "ldconfig".

+0

Tôi không có quyền root trong máy chủ biên dịch được thực hiện. Máy chủ là * chỉ * để biên dịch và nhị phân sẽ không được thực hiện trên nó. Câu hỏi đầu tiên là tại sao tại * link * thời gian tôi cần phải chăm sóc môi trường thời gian chạy và thứ hai là làm thế nào để thoát khỏi cảnh báo. – dimba

+1

@dimba Bạn không cần phải quan tâm đến nó. Nó chỉ là một cảnh báo thông báo cho bạn rằng các nhị phân sẽ không chạy trên máy hiện tại. Còn về cách vô hiệu hóa cảnh báo mà không sử dụng đường chạy trong khi liên kết, tôi không biết. (Sử dụng một rpath thường không phải là một ý tưởng tốt, trừ khi bạn bó thư viện với thực thi của bạn.) Nếu bạn không có quyền root, sau đó LD_LIBRARY_PATH là lựa chọn duy nhất của bạn. –

0

Cách duy nhất để tắt tiếng cảnh báo này bằng cách sử dụng tùy chọn dòng lệnh sẽ là cờ -L tò mò không hoạt động cho bạn (có thể bạn có thể đăng thêm chi tiết về điều này). Vì cảnh báo được tạo bởi ld, chúng tôi có thể thử sử dụng -Wl,option để tắt cảnh báo liên kết nhưng từ documentation of GNU ld tuy nhiên không có tùy chọn để (de) kích hoạt cảnh báo này.

Vì vậy, điều này khiến chúng tôi viết một kịch bản trình bao bọc lọc cảnh báo này hoặc biên dịch phiên bản tùy chỉnh ld.

-1

Tôi biết điều này là cũ, nhưng here's a better fix:

Các nguyên nhân gốc rễ:

Vấn đề thực sự xảy ra khi LD gọi bởi GCC bắt đầu giải quyết phụ thuộc thư viện. Cả GCC và LD đều nhận thức được các thư viện chứa sysroot , tuy nhiên LD có thể thiếu một thành phần quan trọng : tệp /etc/ld.so.conf. Đây là một exampleld.so.file conf từ một hệ thống Raspberry PI:

bao gồm /etc/ld.so.conf.d/*.conf

Thư mục /etc/ld.so.conf.d chứa các tập tin sau đây:

00-vmcs.conf: /opt/vc/lib

cánh tay-linux-gnueabihf.conf:

/lib/cánh tay-linux-gnueabihf/usr/lib/cánh tay-linux-gnueabihf

libc.conf:

/usr/local/lib

Universal giải pháp

Sự cố có thể dễ dàng được giải quyết bằng cách sao chép cấu hình LD fi les đến vị trí mà LD của chuỗi công cụ chéo có thể tìm thấy chúng. Tuy nhiên, có một lỗ hổng: nếu cross-toolchain của bạn được xây dựng với MinGW (hầu hết là), nó có thể không có quyền truy cập vào hàm glob() để nó sẽ không thể phân tích cú pháp câu lệnh bao gồm ký tự đại diện như * .conf. Cách giải quyết ở đây là để chỉ bằng tay kết hợp nội dung của tất cả các file conf từ /etc/ld.so.conf.d và dán chúng vào /etc/ld.so.conf

*/opt/vc/lib

/lib/cánh tay-linux-gnueabihf

/usr/lib/cánh tay-linux-gnueabihf

/usr/local/lib *

Khi bạn tạo ra các ld. tập tin so.conf trong th e đúng thư mục, chuỗi công cụ của bạn sẽ có thể giải quyết tất cả các tham chiếu thư viện được chia sẻ tự động và bạn sẽ không thấy thông báo lỗi đó nữa!

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