Bir dizini yerel olarak ana dizine yüklemek, ancak program kütüphaneyi tanımıyor


10

Root kullanıcısı olmayan bir sunucuya bir program yüklüyorum. Özellikle tmux 1.5, ama bu bence yerel olarak yüklü tüm program için geniş ölçüde geçerli olmalıdır (bu sorunun kendi hatam olmaması durumunda program adını belirtiyorum).

Program bazı bağımlı kütüphaneler (örn. Libevent ve ncurses) yüklememi gerektiriyor. Bu yüzden, kök erişimim olmadığından ikisini de yerel olarak yükledim

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

Şimdi, programı yüklemek için, kütüphane paketlerini de eklemek zorunda kaldım:

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

Tamam, bu yüzden programı $ HOME / local / bin içine sorunsuz yükler, ancak yürütülebilir dosyayı çalıştırırsam: $ HOME / local / bin / tmux, aşağıdaki hatayı alıyorum:

tmux: paylaşılan kitaplıkları yüklerken hata: libevent-2.0.so.5: paylaşılan nesne dosyasını açamıyor: Böyle bir dosya veya dizin yok

Bana öyle geliyor ki program istenen kütüphaneleri bulamıyor, ancak libevent-2.0.so.5 dosyası aslında yapılandırma seçeneklerinde belirtildiği gibi $ HOME / local / lib dosyasında mevcut. Çalıştırmak için programın kurulu kütüphaneyi tanımasını nasıl sağlayabilirim diye merak ediyorum. $ HOME / lib, $ HOME / bin ve $ HOME / local / bin'e sembolik bağlantılar koymayı denedim, ancak bunların hiçbiri işe yaramadı. Herhangi bir fikir ve önerilen büyük mutluluk duyacağız


Ben varsaymak -R $DIR/libiçin CFLAGSinşa ederken olduğu tmux(ve libevent). Bu bana yardımcı olmadı - gcc'den tanıyamayacağını söyleyen son bir hata vardı -R(ayrıca, -Rve arasındaki boşluk olmadan denedim $DIR). ./configure --disable-shared Bu çalıştı, güncelleme LD_LIBRARY_PATHde çalıştı. libeventYukarıdaki --disable-sharedseçenek ile tekrar yapma sona erdi .

Yanıtlar:


20

Kullanarak libevent'i yeniden oluşturmayı deneyin

./configure --disable-shared

İkili oluştururken kütüphane ile bağlantılı olacağından ve çalışma zamanında aranmaya gerek olmadığından, bunun sorununuzu çözeceğinden şüpheleniyorum.

Alternatif olarak, dinamik olarak bağlı bir libevent'e ihtiyacınız varsa, içeren libevent-2.0.so.5 dizinini LD_LIBRARY_PATH ortam değişkeninize ekleyebilirsiniz:

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

Vay canına, hızlı cevap için çok teşekkürler. Bu düzeltmeyi gelecekteki herhangi bir kütüphane kurulumuna uygulayabildiğim ve her zaman $ HOME / local dizinini kullanabildiğim için sorunu düzeltmek için LD_LIBRARY_PATH kullandım. Yardımınız için teşekkür ederiz!
scicalculator


2

Diğerleriyle şans yok, ama bu benim için çalıştı, buradan :

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

2

Benzer bir soru sordum , ilginç bir şekildetmux her şeyin inşası hakkında da (her ne kadar bunun hala GNU'nun configureve makebirlikte kullanıldığı herhangi bir durumla ilgili olduğundan emin olmama rağmen) .

Ben daha temiz bir yaklaşım sözde "rpath" - ikili gömülü kütüphane arama yolu kullanmak olduğuna inanıyorum. En -rpathaz GNU bağlayıcısının anahtarı ldyolu belirtir.

Yapı komut satırı aşağıdaki gibi görünecektir:

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

Gerçekten burada her şeyden değil, ama PKG_CONFIG_PATHyukarıda basitçe insanlar aksi gönderme elle başarmak ne yapacağını tavsiye yoludur -L/path/to/libevent/lib -I/path/to/libevent/includeiçin ./configurekomut. Eğer oluştururken libevent, bu için kendi yapılandırma dosyalarını yükler pkg-config(ki tarafından kullanılır ./configure). Bunu kullanmalısınız, çünkü buna karşı inşa ederken hangi anahtarların kullanılması gerektiğini libevent kesinlikle bilir.

Her neyse, bazı durumlarda, -rpathsorunu çözmek için daha temiz bir yaklaşımdır.

LD_LIBRARY_PATHtabanlı çözümler, zaman zaman inşa edilen binary tarafından kullanılan kitaplığı dengelemek için izin verir, bu da bazen istenir. Ancak, sadece bir yerde ana klasörünüzde özel bir yere koyduğunuz belirli bir kütüphaneye karşı inşa etmek istiyorsanız, bence -rpathtabanlı çözümler kanonik bir cevap olarak görülmelidir.

Garip olan şey, tmux'kendi derleme komut dosyalarının bu yolu bina sırasında kütüphane arama yolundan çıkarmamasıdır. Belki ihtiyaç duyuyorlar ve yapmamalılar, bilmiyorum. Bu bize inşa eden bir tesadüf mü tmux?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.