Cài đặt thư viện cục bộ trong thư mục chính, nhưng chương trình không nhận ra nó


10

Tôi đang cài đặt một chương trình trên máy chủ với tư cách là người dùng không root. Cụ thể đó là tmux 1.5, nhưng theo tôi thì nên áp dụng rộng rãi cho tất cả các chương trình được cài đặt cục bộ (tôi đề cập đến tên chương trình trong trường hợp vấn đề này kết thúc không phải là lỗi của tôi).

Chương trình yêu cầu tôi cài đặt một số thư viện phụ thuộc (ví dụ: libevent và ncurses). Vì vậy, tôi đã cài đặt cả hai cục bộ vì tôi không có quyền truy cập root

cd $HOME/library/installation/folder
DIR=$HOME/local
./configure --prefix=$DIR 
#... make ... make install 

Bây giờ, để cài đặt chương trình, tôi cũng phải bao gồm các gói thư viện:

cd $HOME/program/installation/folder
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
#... make ... make install 

Ok, vì vậy, điều này sẽ cài đặt chương trình mà không gặp vấn đề gì với $ HOME / local / bin, nhưng nếu tôi chạy tệp thực thi: $ HOME / local / bin / tmux, tôi gặp lỗi sau:

tmux: lỗi trong khi tải thư viện dùng chung: libevent-2.0.so.5: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy

Dường như với tôi rằng chương trình không thể tìm thấy các thư viện mong muốn, nhưng tệp libevent-2.0.so.5 thực sự tồn tại trong $ HOME / local / lib như được chỉ định trong các tùy chọn cấu hình. Tôi tự hỏi làm thế nào tôi có thể khiến chương trình nhận ra thư viện đã cài đặt để chạy. Tôi đã thử đặt các liên kết tượng trưng trong $ HOME / lib, $ HOME / bin và $ HOME / local / bin, nhưng không có liên kết nào trong số này hoạt động. Bất kỳ ý tưởng và đề xuất sẽ được đánh giá rất cao


Tôi cho rằng -R $DIR/libđể CFLAGSlà trong khi xây dựng tmux(và không libevent). Điều này không giúp tôi - có một số lỗi cuối cùng từ gcc nói rằng nó không thể nhận ra -R(ngoài ra , tôi đã thử mà không có khoảng cách giữa -R$DIR). ./có hình --disable-shared Điều này hoạt động, cập nhật LD_LIBRARY_PATHcũng hoạt động. Tôi đã kết thúc việc làm libeventlại với --disable-sharedtùy chọn trên .

Câu trả lời:


20

Hãy thử xây dựng lại libevent bằng cách sử dụng

./configure --disable-shared

Tôi nghi ngờ điều này sẽ khắc phục vấn đề của bạn vì thư viện sẽ được liên kết với khi xây dựng nhị phân và không cần tìm kiếm khi chạy.

Ngoài ra, nếu bạn có nhu cầu về một libevent được liên kết động, bạn có thể thêm thư mục chứa libevent-2.0.so.5 vào biến môi trường LD_LIBRARY_PATH của bạn:

export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}

Wow, cảm ơn rất nhiều vì đã trả lời nhanh chóng. Tôi đã kết thúc bằng cách sử dụng LD_LIBRARY_PATH để khắc phục sự cố vì tôi có thể chỉ cần áp dụng sửa lỗi này cho bất kỳ cài đặt thư viện nào trong tương lai và luôn sử dụng thư mục $ HOME / cục bộ. Đánh giá cao sự giúp đỡ!
scicalculator


2

Không có may mắn với những người khác, nhưng điều này làm việc cho tôi, từ đây :

sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

2

Tôi đã hỏi một câu hỏi tương tự , cũng khá thú vị về việc xây dựng tmuxtất cả mọi thứ (mặc dù tôi vẫn chắc chắn điều này liên quan đến bất kỳ tình huống nào mà GNU configuremakeđược sử dụng cùng nhau.

Tôi tin rằng một cách tiếp cận sạch hơn là sử dụng cái gọi là "rpath" - đường dẫn tìm kiếm thư viện được nhúng trong tệp nhị phân. Công -rpathtắc của ít nhất GNU linker ldchỉ định đường dẫn.

Dòng lệnh xây dựng sau đó sẽ trông như sau:

PKG_CONFIG_PATH=/path/to/libevent/lib/pkg-config LDFLAGS=-Wl,-rpath,/path/to/libevent/lib ./configure ...

Không thực sự tối quan trọng ở đây, nhưng PKG_CONFIG_PATHở trên chỉ đơn giản là cách được đề xuất để làm những gì mọi người đạt được bằng cách gửi thủ công -L/path/to/libevent/lib -I/path/to/libevent/includeđến ./configurekịch bản. Khi bạn xây dựng libevent, nó sẽ cài đặt các tệp cấu hình của riêng nó pkg-config(được sử dụng bởi ./configure). Bạn nên sử dụng nó, bởi vì chỉ libevent chắc chắn biết những công tắc nào nên được sử dụng khi xây dựng chống lại nó.

Dù sao, trong một số tình huống, -rpathlà một cách tiếp cận sạch hơn để giải quyết vấn đề.

LD_LIBRARY_PATHTuy nhiên, các giải pháp dựa trên cơ sở cho phép bạn sắp xếp thư viện được sử dụng bởi tệp nhị phân được xây dựng của bạn trong thời gian chạy, điều này đôi khi là mong muốn. Nhưng nếu bạn chỉ muốn xây dựng dựa trên một thư viện cụ thể mà bạn đã đặt ở một nơi dành riêng trong thư mục nhà của bạn ở đâu đó, tôi nghĩ -rpathcác giải pháp dựa trên cơ sở được coi là một câu trả lời chính tắc.

Điều kỳ lạ là tại sao tmuxcác tập lệnh xây dựng riêng không suy ra đường dẫn này từ đường dẫn tìm kiếm thư viện trong quá trình xây dựng. Có lẽ họ không cần và không nên, tôi không biết. Có phải là một sự trùng hợp ngẫu nhiên đã xảy ra với chúng tôi những người xây dựng tmux?

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.