LD_LIBRARY_PATH so với LIBRARY_PATH


159

Tôi đang xây dựng một chương trình C ++ đơn giản và tôi muốn thay thế tạm thời một hệ thống được cung cấp thư viện dùng chung với phiên bản mới hơn của nó, để phát triển và thử nghiệm.

Tôi đã thử đặt biến LD_LIBRARY_PATH nhưng trình liên kết (ld) không thành công với:

/ usr / bin / ld: không thể tìm thấy -lyaml-cpp

Tôi mong đợi nó hoạt động vì theo trang ld man:

Trình liên kết sử dụng các đường dẫn tìm kiếm sau để định vị các thư viện chia sẻ được yêu cầu: ... Đối với một trình liên kết gốc, nội dung của biến môi trường "LD_LIBRARY_PATH" ...

Sau đó, tôi đã thử thiết lập LIBRARY_PATH và nó đã hoạt động.

Theo hướng dẫn của GCC:

Giá trị của LIBRARY_PATH là một danh sách các thư mục được phân tách bằng dấu hai chấm, giống như PATH. Khi được định cấu hình như một trình biên dịch gốc, GCC sẽ thử các thư mục được chỉ định khi tìm kiếm các tệp liên kết đặc biệt, nếu nó không thể tìm thấy chúng bằng GCC_EXEC_PREFIX. Liên kết bằng GCC cũng sử dụng các thư mục này khi tìm kiếm các thư viện thông thường cho tùy chọn -l (nhưng các thư mục được chỉ định bằng -L xuất hiện trước).

Như hướng dẫn (GCC) gợi ý, LIBRARY_PATH hoạt động vì tôi liên kết với GCC.

Nhưng..

  • Vì tôi liên kết với gcc tại sao ld được gọi, như thông báo lỗi cho thấy?
  • Điểm có hai biến phục vụ cùng một mục đích là gì? Có sự khác biệt nào khác không?

Câu trả lời:


213

LIBRARY_PATH được sử dụng bởi gcc trước khi biên dịch để tìm kiếm các thư mục chứa các thư viện tĩnh và chia sẻ cần được liên kết với chương trình của bạn.

LD_LIBRARY_PATHđược chương trình của bạn sử dụng để tìm kiếm các thư mục chứa các thư viện dùng chung sau khi nó được biên dịch và liên kết thành công.

EDIT: Như được chỉ ra dưới đây, thư viện của bạn có thể tĩnh hoặc được chia sẻ. Nếu nó là tĩnh thì mã được sao chép vào chương trình của bạn và bạn không cần tìm kiếm thư viện sau khi chương trình của bạn được biên dịch và liên kết. Nếu thư viện của bạn được chia sẻ thì nó cần phải được liên kết động với chương trình của bạn và đó là khi LD_LIBRARY_PATHđi vào hoạt động.


14
Và tất nhiên, LD_LIBRARY_PATH chỉ có ý nghĩa với các thư viện động
Alex Jasmin

2
Quan điểm của tôi là nếu tôi sử dụng ld để liên kết (trực tiếp), thì theo hướng dẫn của ld, LD_LIBRARY_PATH sẽ được sử dụng để tìm kiếm các thư mục chứa các thư viện cần được liên kết với chương trình của tôi. Tôi phải thiếu một cái gì đó ở đây ..
Georgios Politis

2
trừ khi bạn tự gọi ld và kết hợp các tệp đối tượng với các thư viện, nó sẽ 'kế thừa' đường dẫn mà gcc chuyển đến nó. Bạn có thể ghi đè gcc tiêu chuẩn, với tùy chọn -Xlinker.
Naveen

5
Trên thực tế, LIBRARY_PATH được sử dụng để tìm kiếm các thư mục chứa các thư viện tĩnh động, thay vì chỉ các thư viện tĩnh.
hạt128

3
Vâng, điều này là sai - sự khác biệt là LIBRARY_PATHtìm kiếm các thư viện (tĩnh hoặc động) tại thời gian biên dịchLD_LIBRARY_PATHđược tìm kiếm các thư viện động trong thời gian chạy. Tất nhiên vào thời gian chạy, bạn không cần phải tìm kiếm các thư viện tĩnh.
Timmmm

47

LD_LIBRARY_PATHđược tìm kiếm khi chương trình bắt đầu, LIBRARY_PATHđược tìm kiếm tại thời điểm liên kết.

báo trước từ ý kiến :


38
Lưu ý: khi liên kết các thư viện, ldbản thân nó không tìm kiếm các thư viện trong một LIBRARY_PATHhoặc LD_LIBRARY_PATH. Đó là chỉ khi gccgọi ldLIBRARY_PATHtrở nên được sử dụng. (Đã học được điều này một cách khó khăn.)
Rufflewind

1
@Rufflewind Thú vị, nhưng thậm chí còn nhiều hơn nếu bạn đã đưa ra bất kỳ tham chiếu nào.
hmijail thương tiếc người từ chức

Chế độ xem này tạo sự khác biệt trong thời điểm các thư viện được tìm kiếm (thời gian liên kết so với thời gian chạy) trong khi @Naveen phân biệt loại thư viện được tìm kiếm (tĩnh v động). Có hai khung nhìn giống hệt nhau một cách hiệu quả (động: thời gian chạy = tĩnh: thời gian liên kết) hoặc có những tình huống quan trọng khi sự tương ứng này không giữ được không? Tôi đoán rằng một số kiến ​​thức về các thư viện động cũng cần thiết vào thời gian biên dịch.
XavierStuvw

13

Vì tôi liên kết với gcc tại sao ld được gọi, như thông báo lỗi cho thấy?

gcc gọi ld trong nội bộ khi nó ở chế độ liên kết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.