Menginstal perpustakaan secara lokal di direktori home, tetapi program tidak mengenalinya

10

Saya menginstal program di server sebagai pengguna non-root. Khususnya itu tmux 1.5, tetapi ini harus berlaku luas untuk semua program yang diinstal secara lokal menurut saya (saya menyebutkan nama program jika masalah ini akhirnya bukan kesalahan saya sendiri).

Program ini mengharuskan saya untuk menginstal beberapa pustaka dependen (misalnya libevent dan ncurses). Jadi, saya menginstal keduanya secara lokal karena saya tidak memiliki akses root

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

Sekarang, untuk menginstal program, saya juga harus memasukkan paket perpustakaan:

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

Ok, jadi ini menginstal program tanpa masalah ke $ HOME / local / bin, tetapi jika saya menjalankan executable: $ HOME / local / bin / tmux, saya mendapatkan kesalahan berikut:

tmux: kesalahan saat memuat pustaka bersama: libevent-2.0.so.5: tidak dapat membuka file objek bersama: Tidak ada file atau direktori tersebut

Tampaknya bagi saya bahwa program tidak dapat menemukan perpustakaan yang diinginkan, tetapi file libevent-2.0.so.5 memang ada di $ HOME / local / lib seperti yang ditentukan dalam opsi configure. Saya bertanya-tanya bagaimana saya bisa membuat program mengenali pustaka yang diinstal untuk menjalankan. Saya mencoba meletakkan tautan simbolis dalam $ HOME / lib, $ HOME / bin, dan $ HOME / local / bin, tetapi tidak ada yang berhasil. Setiap ide dan saran akan sangat dihargai

scicalculator
sumber
Saya berasumsi -R $DIR/libuntuk CFLAGSyang sementara membangun tmux(dan tidak libevent). Ini tidak membantu saya - ada beberapa kesalahan terakhir dari gcc yang mengatakan itu tidak dapat dikenali -R(juga, saya mencoba tanpa spasi di antara -Rdan $DIR). ./configure --disable-shared Ini berfungsi, memperbarui yang LD_LIBRARY_PATHjuga berfungsi. Saya akhirnya membuat libeventlagi dengan --disable-sharedopsi di atas .

Jawaban:

20

Cobalah membangun kembali libevent menggunakan

./configure --disable-shared

Saya menduga ini akan memperbaiki masalah Anda karena perpustakaan akan ditautkan ketika membangun biner dan tidak perlu dicari saat runtime.

Selain itu, jika Anda membutuhkan libevent yang terhubung secara dinamis, Anda dapat menambahkan direktori yang mengandung libevent-2.0.so.5 ke variabel lingkungan LD_LIBRARY_PATH Anda:

export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}
drootang
sumber
Wow, terima kasih banyak atas jawaban cepatnya. Saya akhirnya menggunakan LD_LIBRARY_PATH untuk memperbaiki masalah karena saya bisa menerapkan perbaikan ini untuk instalasi perpustakaan di masa depan dan selalu menggunakan direktori $ HOME / local. Hargai bantuannya!
scicalculator
2

Tidak beruntung dengan yang lain, tetapi ini berhasil untuk saya, dari sini :

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

Saya telah mengajukan pertanyaan serupa , cukup menarik juga tentang membangun tmuxsemua hal (meskipun saya masih yakin ini berkaitan dengan situasi apa pun di mana GNU configuredan makedigunakan bersama-sama.

Saya percaya pendekatan yang lebih bersih adalah dengan memanfaatkan apa yang disebut "rpath" - jalur pencarian perpustakaan yang tertanam dalam biner. The -rpathberalih minimal GNU linker ldmenentukan jalan.

Baris perintah build akan terlihat sebagai berikut:

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

Tidak terlalu penting di sini, tetapi di PKG_CONFIG_PATHatas hanyalah cara yang disarankan untuk melakukan apa yang orang lain capai secara manual mengirim -L/path/to/libevent/lib -I/path/to/libevent/includeke ./configureskrip. Ketika Anda membangun libevent, itu menginstal file konfigurasinya sendiri untuk pkg-config(yang digunakan oleh ./configure). Anda harus menggunakannya, karena hanya libevent benar-benar tahu switch apa yang harus digunakan ketika membangun menentangnya.

Bagaimanapun, dalam beberapa situasi, -rpathadalah pendekatan yang lebih bersih untuk menyelesaikan masalah.

LD_LIBRARY_PATHsolusi berbasis, memungkinkan Anda untuk menyulap perpustakaan yang digunakan oleh biner Anda dibangun pada saat runtime, yang kadang-kadang diinginkan. Tetapi jika Anda hanya ingin membangun terhadap perpustakaan tertentu yang telah Anda letakkan di tempat khusus di folder rumah Anda di suatu tempat, saya pikir -rpathsolusi berbasiskan dianggap sebagai jawaban kanonik.

Yang aneh adalah mengapa tmuxskrip build sendiri tidak menyimpulkan path ini dari path pencarian library selama building. Mungkin mereka tidak perlu dan tidak boleh, saya tidak tahu. Apakah ini kebetulan yang terjadi pada kami yang membangun tmux?

amn
sumber