LD_LIBRARY_PATH ở đâu? Làm cách nào để tôi đặt biến env LD_LIBRARY_PATH?


26

Tôi đang cố gắng xây dựng một chương trình c ++ bằng Unix.

Tôi đã nhận được lỗi

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

Tôi nghe nói rằng tôi chỉ cần đặt vị trí của libboost * trong biến env LD_LIBRARY_PATH của mình và sau đó gọi make như tôi đã làm ban đầu, bằng cách gõ

-L /usr/lib64 -l boost_regex-mt

hoặc là

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Nhưng LD_LIBRARY_PATH ở đâu? Làm cách nào để tôi đặt biến env LD_LIBRARY_PATH?


Tại sao bạn chỉnh sửa hầu hết câu hỏi của mình trong khi nó đang cung cấp một số bối cảnh hữu ích để hiểu vấn đề của bạn?
jlliagre

@jlliagre Tôi đồng ý: không có ngữ cảnh được cung cấp bởi câu hỏi ban đầu, câu trả lời được bình chọn hàng đầu sẽ không có ý nghĩa. Tôi lăn nó trở lại.
John1024

Câu trả lời:


25

Làm cách nào để tôi đặt biến env LD_LIBRARY_PATH?

Bạn đã thiết lập nó khi bạn làm điều này:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Nhưng điều đó sẽ không giải quyết vấn đề của bạn. $LD_LIBRARY_PATHđược tư vấn tại thời điểm thực hiện, để cung cấp một danh sách các thư mục bổ sung để tìm kiếm các thư viện có thể liên kết động. Nó không được tham khảo tại thời điểm liên kết (ngoại trừ có thể để định vị các thư viện được yêu cầu bởi chính các công cụ được xây dựng!).

Để thông báo cho trình liên kết nơi tìm thư viện tại thời điểm xây dựng, bạn cần sử dụng -Ltùy chọn liên kết. Bạn cũng đã làm điều đó:

-L /usr/lib64

Nếu bạn vẫn nhận được lỗi, thì bạn cần chắc chắn rằng thư viện thực sự ở đó. Bạn có một tập tin libboost_regex-mt.sohoặc libboost_regex-mt.atrong thư mục đó (hoặc bất kỳ)? Lưu ý rằng một tệp như libboost_regex-mt.so.othersuffixkhông được tính cho mục đích này. Nếu bạn không có điều đó, thì có lẽ bạn cần phải cài đặt gói phát triển phân phối của mình cho thư viện này.


Trong Linux, theo trang man ld (1), $LD_LIBRARY_PATHcũng được tư vấn bởi ld: «5. Đối với một trình liên kết riêng, hãy tìm kiếm nội dung của biến môi trường" LD_LIBRARY_PATH ". »
vinc17

@csx - Bản phân phối của bạn là gì? Ubuntu, Fedora, CentOS, v.v? Xem tại đây, ví dụ: stackoverflow.com/questions/15874220/ từ
slm

@ vinc17, Trích dẫn từ ldtrang này chỉ liên quan đến các phụ thuộc đệ quy: các thư viện phụ thuộc của thư viện đã được chọn để được liên kết. Nó không liên quan đến việc tìm kiếm các thư viện để thực thi được xây dựng. Đó là những gì -L.
Celada

@csx Tôi không biết gì về linux khoa học, nhưng nếu apt-getkhông tìm thấy lệnh của bạn thì đó không phải là nguồn gốc Debian nên bạn cần một phương pháp khác để cài đặt gói bị thiếu. Đó chắc chắn là vấn đề của bạn.
Celada

Muộn nhưng: -Ldir -llibnên hoạt động như các đối số ldhoặc gcc/g++/etckhi bao gồm cả giai đoạn liên kết, nhưng đề cập đến Q ban đầu và được khôi phục make: với một tệp tạo bình thường bạn có thể cần LDFLAGS="whatever"và với một tệp tạo thông minh, bạn có thể cần hầu hết mọi thứ, kể cả gạch để ném vào tác giả tạo tệp thông minh.
dave_thndry_085

11

Một cách khác để thêm vĩnh viễn đường dẫn mới trong LD_LIBRARY_PATH:

Chỉnh sửa .conftập tin trong /etc/ld.so.conf.d/.

Tôi đã từng cài đặt một ứng dụng và các thư viện của nó không thể được nhận ra bởi một ứng dụng khác. Sau đó, tôi thêm đường dẫn, tức là /usr/local/hdf5/libvào x86_64-linux-gnu.conftập tin. Chỉ cần đặt trong dòng tiếp theo. Tiết kiệm.

Sau đó chạy sudo ldconfig

Nó đã làm việc.

PS: Hệ điều hành Ubuntu 14.04


4

Bạn có thể đặt nó trong ~/.profiletệp init và / hoặc cụ thể của shell của bạn (ví dụ: ~/.bashrcbash, ~/.zshenvcho zsh). Sau đó, bạn cần khởi động lại shell của mình (và có thể đăng xuất và đăng nhập lại, tùy thuộc vào lựa chọn của bạn).

Bạn có thể kiểm tra cài đặt của mình với:

env | grep '^LD_LIBRARY_PATH'

EDIT: LD_LIBRARY_PATHdành cho các thư viện dùng chung có chứa mã máy, tên tệp thường chứa .sotrong tên của chúng, có thể được theo sau bởi các số được phân tách bằng dấu chấm để phân biệt các phiên bản khác nhau. Có thể là mặc dù LD_LIBRARY_PATH, một thư viện không được tìm thấy vì ABI không khớp. Cũng lưu ý rằng các ngôn ngữ (như Perl và Python) và các gói có thể có hệ thống thư viện riêng (cũng có thể có .sotệp), không liên quan đến LD_LIBRARY_PATH.


Chương trình biên dịch của tôi vẫn phàn nàn về việc không tìm thấy thư viện python mặc dù tôi thấy đường dẫn chính xác bằng env | grep '^ LD_LIBRARY_PATH'. Điều gì có thể là vấn đề?
Herman Toothrot

@HermanToothrot Tôi đã cập nhật câu trả lời của tôi. Lưu ý rằng python có hệ thống thư viện riêng. Tôi nghi ngờ rằng nó không sử dụng LD_LIBRARY_PATH(để tránh va chạm với các thư viện thông thường). Bạn cần đặt một câu hỏi cụ thể cho việc này, với thông báo lỗi bạn nhận được.
vinc17

3

Nếu lỗi đường dẫn thư viện của bạn nằm trong trình liên kết, trong quá trình biên dịch, bạn cần thêm đường dẫn đến thư viện vào biến $ LD_LIBRARY_PATH. Nếu lỗi thư viện là khi bạn thực sự chạy chương trình đã biên dịch thì bạn cần thêm đường dẫn thư viện vào /etc/ld.so.conf và chạy ldconfig để xây dựng lại bộ đệm đường dẫn tìm kiếm thư viện.


Điều này đã làm việc tuyệt vời! Tệp conf của tôi trỏ đến thư mục này /etc/ld.so.conf.d vì vậy chỉ cần thêm một tệp có đường dẫn libs của bạn vào thư mục đó. cũng đảm bảo chạy ldconfig với quyền root (hoặc sudo nó)
RLaaa

0

Giải quyết với:

thêm vào /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
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.