การติดตั้งไลบรารีไว้ในโฮมไดเร็กตอรี่ แต่โปรแกรมไม่รู้จัก


10

ฉันกำลังติดตั้งโปรแกรมบนเซิร์ฟเวอร์ในฐานะผู้ใช้ที่ไม่ใช่รูท โดยเฉพาะมันคือ tmux 1.5 แต่สิ่งนี้ควรนำไปใช้กับโปรแกรมที่ติดตั้งในเครื่องทั้งหมดในความคิดของฉัน (ฉันพูดถึงชื่อโปรแกรมในกรณีที่ปัญหานี้จบลงไม่ใช่ข้อผิดพลาดของฉันเอง)

โปรแกรมต้องการให้ฉันติดตั้งไลบรารี่บางอัน (เช่น libevent และ ncurses) ดังนั้นฉันจึงติดตั้งทั้งสองเครื่องเนื่องจากฉันไม่สามารถเข้าถึงรูทได้

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

ตอนนี้เพื่อติดตั้งโปรแกรมฉันต้องรวมแพ็คเกจห้องสมุดด้วย:

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

ตกลงดังนั้นสิ่งนี้จะติดตั้งโปรแกรมโดยไม่มีปัญหาใน $ HOME / local / bin แต่ถ้าฉันเรียกใช้โปรแกรมปฏิบัติการ: $ HOME / local / bin / tmux ฉันได้รับข้อผิดพลาดต่อไปนี้:

tmux: ข้อผิดพลาดขณะโหลดไลบรารีที่แบ่งใช้: libevent-2.0.so.5: ไม่สามารถเปิดไฟล์วัตถุที่แชร์ได้: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

ฉันคิดว่าโปรแกรมไม่สามารถค้นหาไลบรารีที่ต้องการได้ แต่ไฟล์ libevent-2.0.so.5 มีอยู่ใน $ HOME / local / lib ตามที่ระบุในตัวเลือกการกำหนดค่า ฉันสงสัยว่าฉันจะทำให้โปรแกรมจดจำไลบรารีที่ติดตั้งเพื่อให้ทำงานได้อย่างไร ฉันพยายามใส่ลิงก์สัญลักษณ์ใน $ HOME / lib, $ HOME / bin และ $ HOME / local / bin แต่ไม่มีอะไรทำงาน ความคิดและข้อเสนอแนะใด ๆ จะได้รับการชื่นชมอย่างมาก


ผมถือว่า-R $DIR/libจะCFLAGSเป็นในขณะที่อาคารtmux(และไม่ได้libevent) สิ่งนี้ไม่ได้ช่วยฉัน - มีข้อผิดพลาดขั้นสุดท้ายจาก gcc ที่บอกว่าไม่สามารถจดจำได้-R(เช่นกันฉันพยายามโดยไม่มีช่องว่างระหว่าง-Rและ$DIR) ./configure - ปิดการใช้งานร่วมกันใช้งานได้อัปเดตLD_LIBRARY_PATHยังทำงานได้ ฉันสิ้นสุดการสร้างlibeventอีกครั้งด้วย--disable-sharedตัวเลือกด้านบน

คำตอบ:


20

ลองสร้าง libevent อีกครั้งโดยใช้

./configure --disable-shared

ฉันสงสัยว่าสิ่งนี้จะแก้ไขปัญหาของคุณเนื่องจากห้องสมุดจะถูกเชื่อมโยงกับเมื่อสร้างไบนารีและไม่จำเป็นต้องค้นหาเมื่อรันไทม์

อีกทางหนึ่งหากคุณต้องการ libevent ที่เชื่อมโยงแบบไดนามิกคุณสามารถเพิ่มไดเร็กทอรีที่มี libevent-2.0.so.5 ลงในตัวแปรสภาพแวดล้อม LD_LIBRARY_PATH ของคุณ:

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

ว้าวขอบคุณมากสำหรับการตอบกลับอย่างรวดเร็ว ฉันลงเอยด้วยการใช้ LD_LIBRARY_PATH เพื่อแก้ไขปัญหาเนื่องจากฉันสามารถใช้การแก้ไขนี้กับการติดตั้งไลบรารีใด ๆ ในอนาคตและใช้ไดเรกทอรี $ HOME / local เสมอ ขอบคุณสำหรับความช่วยเหลือ!
scicalculator

7

นอกจากนี้คุณยังสามารถตั้งค่า RPATH ซึ่งencodes แพทช์การค้นหาห้องสมุดในไบนารีของตัวเอง

เพียงแค่เพิ่มการ-R $DIR/libCFLAGS



2

ฉันได้ถามคำถามที่คล้ายกันและน่าสนใจพอที่จะสร้างtmuxทุกสิ่ง (แม้ว่าฉันยังมั่นใจว่าเรื่องนี้เกี่ยวข้องกับสถานการณ์ใด ๆ ที่ GNU configureและmakeใช้ร่วมกัน

ฉันเชื่อว่าแนวทางที่สะอาดกว่าคือการใช้ "rpath" ซึ่งเป็นเส้นทางการค้นหาไลบรารีที่ฝังอยู่ในไบนารี -rpathสวิตช์อย่างน้อย GNU ลิงเกอร์ldระบุเส้นทาง

บรรทัดคำสั่ง build จะมีลักษณะดังนี้:

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

ไม่ได้จริงๆสิ่งสำคัญยิ่งที่นี่ แต่PKG_CONFIG_PATHข้างต้นเป็นเพียงวิธีที่แนะนำให้ทำในสิ่งที่คนเป็นอย่างอื่นให้บรรลุด้วยตนเองส่ง-L/path/to/libevent/lib -I/path/to/libevent/includeไปยัง./configureสคริปต์ เมื่อคุณสร้างlibeventมันจะติดตั้งไฟล์กำหนดค่าของตัวเองสำหรับpkg-config(ซึ่งใช้งานโดย./configure) คุณควรจะใช้มันเพราะเพียงlibevent แน่นอนรู้ว่าสิ่งที่สวิทช์ควรใช้เมื่อมีการสร้างกับมัน

อย่างไรก็ตามในบางสถานการณ์-rpathเป็นวิธีที่สะอาดกว่าในการแก้ปัญหา

LD_LIBRARY_PATHอย่างไรก็ตามโซลูชันพื้นฐานช่วยให้คุณสามารถเล่นปาหี่ไลบรารีที่ใช้โดยไบนารี่บิวด์ของคุณที่รันไทม์ซึ่งบางครั้งก็เป็นที่ต้องการ แต่ถ้าคุณต้องการสร้างกับห้องสมุดเฉพาะที่คุณใส่ไว้ในโฟลเดอร์เฉพาะในบ้านของคุณฉันคิดว่า-rpath- โซลูชั่นพื้นฐานจะถือเป็นคำตอบที่ยอมรับได้

สิ่งที่แปลกคือทำไมtmux'สคริปต์สร้างของตัวเองไม่ได้อนุมานเส้นทางนี้จากเส้นทางการค้นหาห้องสมุดในระหว่างการสร้าง บางทีพวกเขาไม่ต้องการและไม่ควรฉันไม่รู้ มันเป็นเรื่องบังเอิญที่เกิดขึ้นกับเราที่สร้างtmux?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.