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
sumber
-R $DIR/lib
untukCFLAGS
yang sementara membanguntmux
(dan tidaklibevent
). Ini tidak membantu saya - ada beberapa kesalahan terakhir dari gcc yang mengatakan itu tidak dapat dikenali-R
(juga, saya mencoba tanpa spasi di antara-R
dan$DIR
). ./configure --disable-shared Ini berfungsi, memperbarui yangLD_LIBRARY_PATH
juga berfungsi. Saya akhirnya membuatlibevent
lagi dengan--disable-shared
opsi di atas .Jawaban:
Cobalah membangun kembali libevent menggunakan
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:
sumber
Anda juga bisa mengatur RPATH, yang menyandikan tambalan pencarian pustaka dalam biner itu sendiri .
Hanya menambahkan
-R $DIR/lib
keCFLAGS
.sumber
Tidak beruntung dengan yang lain, tetapi ini berhasil untuk saya, dari sini :
sumber
Saya telah mengajukan pertanyaan serupa , cukup menarik juga tentang membangun
tmux
semua hal (meskipun saya masih yakin ini berkaitan dengan situasi apa pun di mana GNUconfigure
danmake
digunakan bersama-sama.Saya percaya pendekatan yang lebih bersih adalah dengan memanfaatkan apa yang disebut "rpath" - jalur pencarian perpustakaan yang tertanam dalam biner. The
-rpath
beralih minimal GNU linkerld
menentukan jalan.Baris perintah build akan terlihat sebagai berikut:
Tidak terlalu penting di sini, tetapi di
PKG_CONFIG_PATH
atas hanyalah cara yang disarankan untuk melakukan apa yang orang lain capai secara manual mengirim-L/path/to/libevent/lib -I/path/to/libevent/include
ke./configure
skrip. Ketika Anda membangunlibevent
, itu menginstal file konfigurasinya sendiri untukpkg-config
(yang digunakan oleh./configure
). Anda harus menggunakannya, karena hanyalibevent
benar-benar tahu switch apa yang harus digunakan ketika membangun menentangnya.Bagaimanapun, dalam beberapa situasi,
-rpath
adalah pendekatan yang lebih bersih untuk menyelesaikan masalah.LD_LIBRARY_PATH
solusi 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-rpath
solusi berbasiskan dianggap sebagai jawaban kanonik.Yang aneh adalah mengapa
tmux
skrip 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 membanguntmux
?sumber