เรียนรู้ที่จะรวบรวมสิ่งต่าง ๆ จากแหล่งที่มา (บน Unix / Linux / OSX)


47

ในขณะที่ฉันติดตั้งซอฟต์แวร์จากแพ็คเกจ (MacPorts / apt-get) ที่เป็นไปได้เสมอฉันมักพบว่าตัวเองต้องการรวบรวมแพ็คเกจจากแหล่งที่มา ./configure && make && sudo make installมักจะเพียงพอ แต่บางครั้งก็ใช้งานไม่ได้และเมื่อไม่เป็นเช่นนั้นฉันมักจะติดขัด สิ่งนี้มักจะเกี่ยวข้องกับการพึ่งพาไลบรารีอื่น ๆ ในบางวิธี

ฉันต้องการเรียนรู้สิ่งต่อไปนี้:

  • ฉันจะทราบได้อย่างไรว่าจะโต้แย้งกัน./configureอย่างไร
  • วิธีการที่ห้องสมุดที่ใช้ร่วมกันทำงานภายใต้ OS X / Linux - ที่พวกเขาอาศัยอยู่บนระบบแฟ้ม./configure && makeพวกเขาพบพวกเขาอย่างไรสิ่งที่เกิดขึ้นจริงเมื่อพวกเขาเชื่อมโยงกับ
  • อะไรคือความแตกต่างที่แท้จริงระหว่างไลบรารีที่แบ่งใช้และไลบรารีที่เชื่อมโยงแบบสแตติก เหตุใดฉันจึงไม่สามารถลิงก์ทุกอย่างแบบคงที่ (RAM และพื้นที่ดิสก์มีราคาถูกในปัจจุบัน) และหลีกเลี่ยงข้อขัดแย้งของเวอร์ชันไลบรารีแปลก ๆ
  • ฉันจะบอกได้ว่าห้องสมุดใดที่ฉันติดตั้งไว้และรุ่นใด
  • ฉันจะติดตั้งไลบรารีมากกว่าหนึ่งเวอร์ชันโดยไม่ทำให้ระบบปกติเสียหายได้อย่างไร
  • ถ้าผมกำลังติดตั้งสิ่งที่มาจากแหล่งในระบบที่มีการจัดการอย่างอื่นใช้แพคเกจเป็นสิ่งที่เป็นวิธีที่สะอาดในการทำเพื่อ?
  • สมมติว่าฉันจัดการเพื่อรวบรวมบางสิ่งบางอย่างเที่ยวยุ่งยิ่งจากแหล่งที่มาฉันจะแพคเกจที่ขึ้นเพื่อให้คนอื่นไม่ต้องกระโดดผ่านห่วงเดียวกัน โดยเฉพาะอย่างยิ่งใน OS X ....
  • เครื่องมือบรรทัดคำสั่งที่ฉันต้องใช้ในการทำสิ่งนี้ให้ดีคืออะไร? สิ่งต่าง ๆ เช่น otool, pkg-config เป็นต้น

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

คำตอบ:


40

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

1. ฉันจะทราบได้อย่างไรว่าอาร์กิวเมนต์ใดที่จะส่งผ่านไปยัง. / config

ฝึกฝนจริง ๆ Autotools นั้นง่ายพอเพราะสอดคล้องกัน แต่มีสิ่งต่าง ๆ มากมายโดยใช้ cmake หรือสคริปต์สร้างที่กำหนดเอง โดยทั่วไปคุณไม่ควรผ่านการกำหนดค่าใด ๆ มันควรจะเข้าใจว่าระบบของคุณสามารถสร้างเครื่องมือ foo หรือไม่

เครื่องมือกำหนดค่าและ GNU ล้วน แต่มองหาการพึ่งพา /, / usr และ / usr / local หากคุณติดตั้งสิ่งใดก็ตาม (ซึ่งทำให้สิ่งต่าง ๆ เจ็บปวดหากติดตั้งการพึ่งพาโดย MacPorts หรือ Fink) คุณจะต้องผ่านการตั้งค่าสถานะเพื่อกำหนดค่าหรือแก้ไขสภาพแวดล้อมของเชลล์เพื่อช่วยให้เครื่องมือ GNU ค้นหาการขึ้นต่อกันเหล่านี้

2. วิธีการที่ห้องสมุดที่ใช้ร่วมกันทำงานภายใต้ OS X / Linux - ที่ที่พวกเขาอาศัยอยู่บนระบบแฟ้มวิธีการ. / กำหนดค่าและทำให้พบพวกเขาสิ่งที่เกิดขึ้นจริงเมื่อพวกเขาเชื่อมโยงกับ

บน Linux พวกเขาจำเป็นต้องติดตั้งไปยังพา ธ ที่ตัวเชื่อมโยงแบบไดนามิกสามารถค้นหาสิ่งนี้ถูกกำหนดโดยLD_LIBRARY_PATHตัวแปรสภาพแวดล้อมและเนื้อหาของ /etc/ld.conf บน Mac มันเหมือนกันสำหรับซอฟต์แวร์โอเพนซอร์ซส่วนใหญ่เกือบตลอดเวลา (เว้นแต่เป็นโครงการ Xcode) ยกเว้นตัวแปร env DYLD_LIBRARY_PATHแทน

มีเส้นทางเริ่มต้นที่ตัวเชื่อมโยงค้นหาไลบรารี เป็น / lib: / usr / lib: / usr / local / lib

คุณสามารถเสริมสิ่งนี้ได้โดยใช้ตัวแปร CPATH หรือ CFLAGS หรือตัวแปรสภาพแวดล้อมอื่น ๆ จำนวนมาก (ซับซ้อนอย่างสะดวก) ฉันขอแนะนำ CFLAGS ดังนี้:

ส่งออก CFLAGS = "$ CFLAGS -L / ใหม่ / เส้นทาง"

พารามิเตอร์ -L เพิ่มให้กับลิงก์พา ธ

สิ่งทันสมัยใช้เครื่องมือ pkg-config สิ่งทันสมัยที่คุณติดตั้งจะติดตั้งไฟล์. pc ที่อธิบายถึงไลบรารี่และตำแหน่งที่อยู่และวิธีการเชื่อมโยงไปยังไลบรารี ทำให้ชีวิตง่ายขึ้น แต่มันไม่ได้มาพร้อมกับ OS X 10.5 ดังนั้นคุณจะต้องติดตั้งเช่นกัน ยังมี Deps พื้นฐานมากมายที่ไม่รองรับ

การกระทำของการเชื่อมโยงเป็นเพียง "แก้ไขฟังก์ชั่นนี้ที่รันไทม์" จริงๆแล้วมันเป็นตารางสตริงขนาดใหญ่

3. อะไรคือความแตกต่างที่แท้จริงระหว่างไลบรารีที่แบ่งใช้และไลบรารีที่เชื่อมโยงแบบสแตติก เหตุใดฉันจึงไม่สามารถลิงก์ทุกอย่างแบบคงที่ (RAM และพื้นที่ดิสก์มีราคาถูกในปัจจุบัน) และหลีกเลี่ยงข้อขัดแย้งของเวอร์ชันไลบรารีแปลก ๆ

เมื่อคุณลิงก์ไปยังไฟล์ไลบรารีแบบคงที่รหัสจะกลายเป็นส่วนหนึ่งของแอปพลิเคชันของคุณ มันจะเหมือนกับว่ามีไฟล์. c ยักษ์หนึ่งไฟล์สำหรับไลบรารีนั้นและคุณได้รวบรวมมันไว้ในแอปพลิเคชันของคุณ

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

คุณสามารถเชื่อมโยงไปยังทุกสิ่งได้อย่างคงที่ แต่น่าเสียดายที่ระบบการสร้างใด ๆ ไม่สามารถทำได้ง่าย คุณต้องแก้ไขการสร้างไฟล์ระบบด้วยตนเอง (เช่น Makefile.am หรือ CMakeLists.txt) อย่างไรก็ตามนี่อาจเป็นสิ่งที่ควรค่าแก่การเรียนรู้หากคุณติดตั้งสิ่งต่าง ๆ ที่จำเป็นต้องใช้ไลบรารีรุ่นต่าง ๆ เป็นประจำและคุณกำลังค้นหาการติดตั้งแบบพึ่งพาได้ยาก

เคล็ดลับคือเปลี่ยนบรรทัดลิงก์จาก -lfoo เป็น -l / path / เป็น / static / foo.a

คุณสามารถค้นหาและแทนที่ได้ หลังจากนั้นตรวจสอบเครื่องมือไม่ได้ลิงก์กับ. so หรือ dylib โดยใช้ ldd foo หรือ otool -L foo

ปัญหาอื่นไม่ได้เป็นห้องสมุดทั้งหมดที่รวบรวมไปยังห้องสมุดคงที่ หลายคนทำ แต่แล้ว MacPorts หรือ Debian อาจตัดสินใจไม่ส่ง

4. ฉันจะทราบได้อย่างไรว่ามีห้องสมุดใดบ้างที่ฉันติดตั้งและเวอร์ชันใด

หากคุณมีไฟล์ pkg-config สำหรับไลบรารีเหล่านั้นมันเป็นเรื่องง่าย:

pkg-config - รายการทั้งหมด

ไม่เช่นนั้นคุณมักจะทำไม่ได้ง่ายๆ dylib อาจมี soname (เช่น. foo.0.1.dylib, soname คือ 0.1) ซึ่งเหมือนกับเวอร์ชั่นของห้องสมุด อย่างไรก็ตามสิ่งนี้ไม่จำเป็น soname เป็นคุณสมบัติการคำนวณแบบไบนารีคุณต้องชนส่วนสำคัญของ soname หากคุณเปลี่ยนรูปแบบของฟังก์ชั่นในห้องสมุด ดังนั้นคุณจะได้รับเช่น เวอร์ชั่น 14.0.5 soname สำหรับไลบรารี่ 2.0 แม้ว่าสิ่งนี้จะไม่ธรรมดา

ฉันหงุดหงิดกับสิ่งเหล่านี้และได้พัฒนาวิธีแก้ปัญหาสำหรับ Mac และฉันกำลังพูดถึงเรื่องต่อไป

5. ฉันจะติดตั้งไลบรารีมากกว่าหนึ่งเวอร์ชันโดยไม่ทำให้ระบบปกติเสียหายได้อย่างไร

วิธีแก้ปัญหาของฉันคือที่นี่: http://github.com/mxcl/homebrew/

ฉันชอบการติดตั้งจากแหล่งและต้องการเครื่องมือที่ทำให้มันง่าย แต่มีการจัดการแพ็คเกจ ดังนั้นฉันจึงสร้าง Homebrew เช่น wget ตัวเองจากแหล่งที่มา แต่ให้แน่ใจว่าได้ติดตั้งไปยังคำนำหน้าพิเศษ:

/usr/local/Cellar/wget/1.1.4

ฉันใช้เครื่องมือ homebrew เพื่อเชื่อมโยงทุกสิ่งเข้ากับ / usr / local ดังนั้นฉันยังคงมี / usr / local / bin / wget และ /usr/local/lib/libwget.dylib

หลังจากนั้นถ้าฉันต้องการ wget รุ่นอื่นฉันสามารถติดตั้งในแบบคู่ขนานและเพียงแค่เปลี่ยนรุ่นที่เชื่อมโยงกับต้นไม้ / usr / local

6. ถ้าฉันกำลังติดตั้งสิ่งต่าง ๆ จากแหล่งข้อมูลบนระบบที่จัดการโดยใช้แพ็คเกจเป็นวิธีที่สะอาดที่สุดในการทำเช่นนั้น?

ฉันเชื่อว่าวิธี Homebrew สะอาดที่สุดดังนั้นควรใช้หรือทำสิ่งที่เทียบเท่า ติดตั้ง / usr / local / pkgs / name / version และ symlink หรือฮาร์ดลิงก์ที่เหลือ

ใช้ / usr / local เครื่องมือบิลด์ที่มีอยู่จะค้นหาการขึ้นต่อกันและส่วนหัว ชีวิตของคุณจะมากได้ง่ายขึ้น

7. สมมติว่าฉันสามารถรวบรวมบางสิ่งบางอย่างจากแหล่งที่มาฉันจะจัดแพคเกจขึ้นมาได้อย่างไรเพื่อที่คนอื่นจะได้ไม่ต้องกระโดดข้ามห่วงเดียวกัน โดยเฉพาะอย่างยิ่งใน OS X ....

หากไม่มีการขึ้นต่อกันคุณสามารถ tar ไดเร็กทอรี build และมอบให้กับบุคคลอื่นที่สามารถทำการ "ติดตั้ง" อย่างไรก็ตามคุณสามารถทำสิ่งนี้ได้อย่างน่าเชื่อถือสำหรับ OS X เวอร์ชั่นเดียวกันที่แน่นอนบน Linux มันอาจจะทำงานได้กับ Linux ที่คล้ายกัน (เช่น Ubuntu) ด้วย Kernel เวอร์ชั่นเดียวกันและ libc รุ่นรอง

เหตุผลที่ทำให้การแจกจ่ายไบนารีบน Unix ไม่ใช่เรื่องง่ายเพราะความเข้ากันได้ของไบนารี คน GNU และทุกคนอื่นเปลี่ยนอินเทอร์เฟซแบบไบนารีบ่อยครั้ง

โดยทั่วไปจะไม่แจกจ่ายไบนารี สิ่งต่าง ๆ อาจแตกในรูปแบบที่แปลกมาก

บน Mac ตัวเลือกที่ดีที่สุดคือทำแพ็คเกจ macports ทุกคนใช้ macports บนลีนุกซ์มีระบบบิลด์และชุดค่าผสมที่แตกต่างกันมากมายฉันไม่คิดว่าจะมีคำแนะนำที่ดีไปกว่าการเขียนรายการบล็อกเกี่ยวกับวิธีที่คุณประสบความสำเร็จในการสร้างเครื่องมือ x ในการกำหนดค่าแปลก ๆ

หากคุณสร้างรายละเอียดแพ็คเกจ (สำหรับ macports หรือ homebrew) ทุกคนสามารถติดตั้งแพ็กเกจนั้นและแก้ไขปัญหาการพึ่งพาได้เช่นกัน อย่างไรก็ตามสิ่งนี้มักจะไม่ใช่เรื่องง่ายและมันก็ไม่ใช่เรื่องง่ายเลยที่จะทำให้สูตร macports ของคุณรวมอยู่ในแผนผัง macports หลัก macports ยังไม่รองรับประเภทการติดตั้งที่แปลกใหม่ แต่ก็มีตัวเลือกหนึ่งสำหรับทุกแพ็คเกจ

หนึ่งในเป้าหมายในอนาคตของฉันกับ Homebrew คือทำให้มันเป็นไปได้ที่จะคลิกลิงค์บนเว็บไซต์ (เช่น homebrew: // blah และมันจะดาวน์โหลดสคริปต์ Ruby ติดตั้ง deps สำหรับแพ็คเกจนั้นแล้วสร้างแอป แต่ใช่ ยังไม่เสร็จ แต่ก็ไม่ยุ่งยากนักเมื่อพิจารณาการออกแบบที่ฉันเลือก

8. เครื่องมือบรรทัดคำสั่งที่ฉันต้องใช้ในการทำสิ่งนี้ให้ดีคืออะไร? สิ่งต่าง ๆ เช่น otool, pkg-config เป็นต้น

otool มีประโยชน์จริง ๆ เท่านั้นหลังจากนั้น มันบอกคุณว่าไบนารีตัวเชื่อมโยงไปถึงอะไร เมื่อคุณหาการขึ้นต่อกันของเครื่องมือที่คุณต้องสร้างมันก็ไร้ประโยชน์ เช่นเดียวกับ pkg-config เนื่องจากคุณจะติดตั้งการพึ่งพาก่อนแล้วจึงจะสามารถใช้งานได้

กลุ่มเครื่องมือของฉันคืออ่านไฟล์ README และ INSTALL และทำการกำหนดค่า --help ดูเอาต์พุตบิลด์เพื่อตรวจสอบว่ามีสติ แยกวิเคราะห์ข้อผิดพลาดของบิลด์ใด ๆ อาจจะเป็นในอนาคตถามใน serverfault :)


2
น่าสนใจ Homebrew ดูเหมือน Portage (ผู้จัดการแพ็คเกจจาก Gentoo Linux) ฟังดูเหมือนชิ้นงานที่ดี
David Z

12

นี่เป็นหัวข้อใหญ่ดังนั้นให้เริ่มด้วย shared library บน Linux (ELF บน Linux และ Mach-O บน OS X), Ulrich Drepper มีการแนะนำที่ดีในการเขียน DSOs (วัตถุที่ใช้ร่วมกันแบบไดนามิก) ซึ่งครอบคลุมบางส่วนของห้องสมุดสาธารณะบน Linux ที่นี่รวมถึงสาเหตุที่สำคัญ

Ulrich ยังอธิบายว่าเหตุใดการเชื่อมโยงแบบคงที่จึงถือว่าเป็นอันตรายหนึ่งในประเด็นสำคัญที่นี่คือการอัปเดตความปลอดภัย บัฟเฟอร์ล้นในห้องสมุดทั่วไป (เช่น zlib) ที่เชื่อมโยงกันอย่างกว้างขวางสามารถทำให้เกิดค่าใช้จ่ายมากสำหรับการกระจาย - สิ่งนี้เกิดขึ้นกับ zlib 1.1.3 ( คำแนะนำของ Red Hat )

เอลฟ์

หน้าคู่มือ linker ld.so

man ld.so 

อธิบายถึงพา ธ และไฟล์พื้นฐานที่เกี่ยวข้องในการลิงก์แบบไดนามิกรันไทม์ บนระบบ Linux ที่ทันสมัยคุณจะเห็นเส้นทางเพิ่มเติมที่เพิ่มผ่าน /etc/ld.so.conf.d/ ที่เพิ่มเข้ามาทาง glob มักจะอยู่ใน /etc/ld.so.conf

หากคุณต้องการที่จะเห็นสิ่งที่มีอยู่แบบไดนามิกผ่านการกำหนดค่า ld.so ของคุณคุณสามารถเรียกใช้

ldconfig -v -N -X

การอ่าน DSO ควรจะให้ความรู้ระดับพื้นฐานที่ดีแก่คุณเพื่อที่จะเข้าใจว่าหลักการเหล่านั้นนำไปใช้กับ Mach-O บน OS X ได้อย่างไร

ผู้ชาย

บน OS X รูปแบบไบนารีคือ Mach-O เอกสารของระบบโลคัลสำหรับตัวลิงก์คือ

man dyld

เอกสารรูปแบบ Machสามารถใช้ได้จากแอปเปิ้ล

เครื่องมือสร้าง UNIX

โดยทั่วไปconfigure, make, make installขั้นตอนการให้บริการโดย autotools GNU ซึ่งมีทั่วไปหนังสือออนไลน์ที่ครอบคลุมบางส่วนของประวัติศาสตร์ของการกำหนดค่า / สร้างแยกและ toolchain GNU Autoconfใช้การทดสอบเพื่อตรวจสอบความพร้อมของฟีเจอร์ในระบบการสร้างเป้าหมายโดยใช้ภาษามาโคร M4เพื่อขับเคลื่อนสิ่งนี้ Automakeนั้นเป็นวิธีการสร้างเทมเพลตสำหรับ Makefiles โดยทั่วไปเทมเพลตจะถูกเรียกว่า Makefile.am ซึ่งจะส่งออก Makefile.in ซึ่งผลลัพธ์ของ autoconf (สคริปต์กำหนดค่า) จะแปลงเป็น Makefile

สวัสดี GNUโปรแกรมทำหน้าที่เป็นตัวอย่างที่ดีสำหรับการทำความเข้าใจ toolchain GNU - และคู่มือการใช้รวมถึงเอกสาร autotools


10

ไซมอน! ฉันรู้ว่าคุณรู้สึกอย่างไร; ฉันต่อสู้กับส่วนนี้ของการเรียนรู้ Linux ด้วย ขึ้นอยู่กับประสบการณ์ของตัวเองผมเขียนสอนเกี่ยวกับบางส่วนของรายการที่คุณอยู่ (ส่วนใหญ่เป็นข้อมูลอ้างอิงสำหรับตัวเอง!): http://easyaspy.blogspot.com/2008/12/buildinginstalling-application-from.html ฉันคิดว่าคุณจะประทับใจกับบันทึกย่อของฉันเกี่ยวกับความเรียบง่ายของแอปพลิเคชั่น Python ในการสร้าง / ติดตั้ง :)

หวังว่านี่จะช่วยได้! และรวบรวมความสุข

ทิมโจนส์


การสร้าง / ติดตั้งแอปพลิเคชันจากแหล่งข้อมูลใน Ubuntu Linux

ในขณะที่ที่เก็บ Ubuntu นั้นเต็มไปด้วยแอปพลิเคชั่นที่ยอดเยี่ยมในครั้งเดียวหรืออื่นคุณจะต้องพบกับเครื่องมือ "ต้องมี" ที่ไม่ได้อยู่ในที่เก็บ (หรือไม่มีแพ็คเกจ Debian) หรือคุณต้องการ รุ่นใหม่กว่าในที่เก็บ คุณทำอะไร? คุณต้องสร้างแอปพลิเคชันจากแหล่งที่มา! ไม่ต้องกังวลมันไม่ซับซ้อนเท่าที่ฟัง นี่คือเคล็ดลับบางอย่างตามประสบการณ์ของฉันจากการเป็นนักสมัครเล่นอันดับ! (ในขณะที่ฉันใช้ Ubuntu สำหรับตัวอย่างนี้แนวคิดทั่วไปควรใช้กับการแจกจ่าย Unix / Linux ส่วนใหญ่เช่น Fedora และแม้แต่แพลตฟอร์ม Cygwin บน Windows)

กระบวนการพื้นฐานของการสร้าง (รวบรวม) แอปพลิเคชันส่วนใหญ่จากแหล่งที่มาตามลำดับนี้: กำหนดค่า -> รวบรวม -> ติดตั้ง โดยทั่วไป Unix / Linux คำสั่งที่จะทำสิ่งเหล่านี้คือ: config-> ->make make installในบางกรณีคุณจะพบหน้าเว็บที่แสดงว่าสิ่งเหล่านี้สามารถรวมกันเป็นคำสั่งเดียว:

$ config && make && make install

แน่นอนคำสั่งนี้อนุมานว่าไม่มีปัญหาในขั้นตอนเหล่านี้ นี่คือที่มาของความสนุก!

เริ่มต้นใช้งาน

หากคุณไม่ได้รวบรวมแอปพลิเคชันจากแหล่งที่มาบนระบบของคุณมาก่อนคุณอาจจำเป็นต้องตั้งค่าด้วยเครื่องมือการพัฒนาทั่วไปบางอย่างเช่นgccชุดคอมไพเลอร์ไฟล์ส่วนหัวทั่วไปบางตัว (คิดว่านี่เป็นรหัสที่เขียนแล้ว โดยบุคคลอื่นที่ใช้โดยโปรแกรมที่คุณติดตั้ง) และเครื่องมือสร้าง โชคดีที่ใน Ubuntu มี metapackage ที่เรียกbuild-essentialว่าจะติดตั้งสิ่งนี้ หากต้องการติดตั้ง (หรือตรวจสอบให้แน่ใจว่าคุณมีอยู่แล้ว!) ให้รันคำสั่งนี้ในเทอร์มินัล:

$ sudo apt-get install build-essential

ตอนนี้คุณมีการตั้งค่าพื้นฐานแล้วให้ดาวน์โหลดไฟล์ต้นฉบับของแอปพลิเคชันและบันทึกลงในไดเรกทอรีที่คุณมีสิทธิ์อ่าน / เขียนเช่นไดเรกทอรี "บ้าน" ของคุณ โดยปกติเหล่านี้จะอยู่ในไฟล์ที่เก็บถาวรที่มีนามสกุลไฟล์อย่างใดอย่างหนึ่งหรือ.tar.gz ก็หมายความว่ามันเป็น "เทปเก็บ" ซึ่งเป็นกลุ่มของไฟล์ที่เก็บรักษาโครงสร้างไดเรกทอรีญาติของพวกเขา ย่อมาจาก gzip (GNU ไปรษณีย์) ซึ่งเป็นรูปแบบที่นิยม Unix / Linux การบีบอัด ในทำนองเดียวกันย่อมาจาก bzip2 ซึ่งเป็นรูปแบบการบีบอัดที่ใหม่กว่าที่ให้การบีบอัดที่สูงขึ้น (ขนาดไฟล์บีบอัดขนาดเล็ก) กว่า gzip.tar.bz2.tar.gz.bz2

หลังจากที่คุณดาวน์โหลดไฟล์ต้นฉบับให้เปิดหน้าต่างเทอร์มินัล (เทอร์มินัลระบบจากเมนูอูบุนตู) และเปลี่ยนเป็นไดเรกทอรีที่คุณบันทึกไฟล์ (ฉันจะใช้~/downloadในตัวอย่างนี้ที่นี่ '~' เป็นทางลัดไปยังไดเรกทอรี "home" ของคุณ) ใช้คำสั่ง tar เพื่อแยกไฟล์จากไฟล์เก็บถาวรที่ดาวน์โหลดมา:

หากไฟล์ของคุณเป็นไฟล์เก็บถาวร gzip (เช่นลงท้ายด้วย.tar.gz) ให้ใช้คำสั่ง:

            $ tar -zxvf filename.tar.gz

หากไฟล์ของคุณเป็นไฟล์เก็บถาวร bzip2 (เช่นลงท้ายด้วย.tar.bz2) ให้ใช้คำสั่ง:

            $ tar -jxvf filename.tar.gz

เคล็ดลับ: หากคุณไม่ต้องการจำสวิตช์บรรทัดคำสั่งทั้งหมดเพื่อแยกไฟล์เก็บถาวรฉันขอแนะนำให้รับยูทิลิตี้เหล่านี้หนึ่ง (หรือทั้งสองอย่าง): dtrx (รายการโปรด!) หรือ deco (เป็นที่นิยมมากกว่า) ด้วยยูทิลิตี้เหล่านี้อย่างใดอย่างหนึ่งคุณเพียงแค่ใส่ชื่อของยูทิลิตี้ (dtrx หรือ deco) และชื่อไฟล์มันจะทำทั้งหมดที่เหลือ ทั้งสองวิธีนี้ "รู้" ว่าจะจัดการกับรูปแบบการเก็บถาวรส่วนใหญ่ที่คุณน่าจะเจอได้อย่างไรและพวกเขาก็มีข้อผิดพลาดที่ยอดเยี่ยม

เมื่อสร้างจากแหล่งที่มามีข้อผิดพลาดทั่วไปสองประเภทที่คุณน่าจะพบ:

  1. ข้อผิดพลาดของการกำหนดค่าเกิดขึ้นเมื่อคุณเรียกใช้สคริปต์การกำหนดค่า (โดยปกติจะเป็นชื่อการกำหนดค่าหรือกำหนดค่า) เพื่อสร้าง makefile ที่เฉพาะเจาะจงสำหรับการตั้งค่าของคุณ
  2. ข้อผิดพลาดของคอมไพเลอร์เกิดขึ้นเมื่อคุณรันคำสั่ง make (หลังจากสร้าง makefile แล้ว) และคอมไพเลอร์ไม่สามารถหารหัสบางอย่างที่ต้องการ

เราจะดูสิ่งเหล่านี้และหารือเกี่ยวกับวิธีการแก้ไข

ข้อผิดพลาดในการกำหนดค่าและการกำหนดค่า

หลังจากที่คุณแตกไฟล์เก็บถาวรซอร์สโค้ดในเทอร์มินัลคุณควรเปลี่ยนเป็นไดเร็กทอรีที่มีไฟล์ที่แตกแล้ว โดยทั่วไปชื่อไดเรกทอรีนี้จะเหมือนกับชื่อของไฟล์ (ไม่มี.tar.gzหรือ.tar.bz2นามสกุล) อย่างไรก็ตามบางครั้งชื่อไดเรกทอรีเป็นเพียงชื่อของแอปพลิเคชันโดยไม่มีข้อมูลรุ่นใด ๆ

ในไดเรกทอรีต้นทางให้ค้นหาREADMEไฟล์และ / หรือINSTALLไฟล์ (หรือบางอย่างที่มีชื่อคล้ายกัน) ไฟล์เหล่านี้มักจะมีข้อมูลที่เป็นประโยชน์เกี่ยวกับวิธีการสร้าง / คอมไพล์แอปพลิเคชันและติดตั้งรวมถึงข้อมูลเกี่ยวกับการพึ่งพา "การพึ่งพา" เป็นเพียงชื่อแฟนซีสำหรับส่วนประกอบหรือไลบรารีอื่น ๆ ที่จำเป็นต้องมีการรวบรวมสำเร็จ

หลังจากที่คุณได้อ่านREADMEและ / หรือINSTALLไฟล์ (และหวังว่ามองเอกสารออนไลน์ใด ๆ ที่เกี่ยวข้องกับการใช้งาน) ดูการปฏิบัติการ (มี "x" การตั้งค่าสิทธิ์ที่ไฟล์) ไฟล์ชื่อหรือconfig configureบางครั้งไฟล์อาจมีนามสกุลเช่น.sh(เช่นconfig.sh) นี่เป็นเชลล์สคริปต์ที่รันยูทิลิตีอื่น ๆ เพื่อยืนยันว่าคุณมีสภาพแวดล้อม "สติ" สำหรับการรวบรวม มันจะตรวจสอบเพื่อให้แน่ใจว่าคุณได้ติดตั้งทุกอย่างที่คุณต้องการ

เคล็ดลับ: ถ้านี้เป็นโปรแกรม Python-based แทนไฟล์ config setup.pyคุณควรจะหาไฟล์ชื่อ แอพพลิเคชั่นของ Python นั้นง่ายมากในการติดตั้ง ในการติดตั้งแอปพลิเคชันนี้ในฐานะที่เป็นรูท (เช่นวาง sudo ไว้ด้านหน้าคำสั่งต่อไปนี้ภายใต้ Ubuntu) ให้เรียกใช้คำสั่งนี้:

    $ python setup.py install

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

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

$ ./config

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

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

ตัวอย่าง

ในบทช่วยสอนนี้ฉันจะใช้เครื่องอ่าน RSS แบบข้อความที่ชื่อว่า Newsbeuter เป็นตัวอย่างสำหรับประเภทของข้อผิดพลาดที่คุณอาจพบเมื่อสร้างแอปพลิเคชันของคุณ สำหรับ Newsbeuter config.shชื่อของสคริปต์การกำหนดค่าที่เป็น ในระบบของฉันเมื่อฉันทำงานconfig.shข้อผิดพลาดต่อไปนี้เกิดขึ้น:

tester@sitlabcpu22:~/download/newsbeuter-1.3$ ./config.sh
Checking for package sqlite3... not found

You need package sqlite3 in order to compile this program.
Please make sure it is installed.

เมื่อทำการวิจัยบางอย่างฉันพบว่าอันที่จริงแล้วsqlite3แอปพลิเคชันได้รับการติดตั้ง อย่างไรก็ตามตั้งแต่ฉันพยายามที่จะสร้างจากแหล่งนี้เป็นเคล็ดลับที่ว่าสิ่งที่config.shเป็นจริงมองหาห้องสมุดการพัฒนา (ส่วนหัว) sqlite3สำหรับ ใน Ubuntu แพคเกจส่วนใหญ่มีแพ็คเกจการพัฒนาที่เกี่ยวข้องซึ่งลงท้าย-devด้วย (แพลตฟอร์มอื่น ๆ เช่น Fedora มักใช้ส่วนต่อท้ายของแพ็คเกจ-develสำหรับแพ็คเกจการพัฒนา)

เพื่อค้นหาแพ็คเกจที่เหมาะสมสำหรับแพ็คเกจการsqlite3พัฒนาเราสามารถใช้apt-cacheยูทิลิตีใน Ubuntu (และในทำนองเดียวกันyumยูทิลิตี้ใน Fedora):

tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-cache search sqlite

คำสั่งนี้ส่งกลับรายการผลลัพธ์ที่ค่อนข้างใหญ่ดังนั้นเราต้องทำงานนักสืบเล็กน้อยเพื่อตรวจสอบว่าแพคเกจใดเหมาะสม libsqlite3-devในกรณีนี้แพคเกจที่เหมาะสมจะออกมาเป็น ขอให้สังเกตว่าบางครั้งแพคเกจที่เรากำลังมองหาจะมีคำนำหน้าแทนเพียงแค่ชื่อแพคเกจเดียวกันบวกlib -devนี่เป็นเพราะบางครั้งเราแค่มองหาไลบรารี่ที่แชร์ซึ่งอาจถูกใช้งานโดยแอพพลิเคชั่นต่าง ๆ มากมาย หากต้องการติดตั้งlibsqlite3-devให้รันคำสั่ง apt-get install ในเทอร์มินัล:

tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-get install libsqlite3-dev

ตอนนี้เราต้องทำงานconfig.shอีกครั้งเพื่อให้แน่ใจว่าเราได้แก้ไขปัญหาการพึ่งพานี้แล้วและเราไม่มีปัญหาการพึ่งพาอีกต่อไป (แม้ว่าฉันจะไม่แสดงที่นี่ในกรณีของ Newsbeuter ฉันก็ต้องติดตั้งlibcurl4-openssl-devแพคเกจด้วย) นอกจากนี้หากคุณติดตั้งแพคเกจการพัฒนา (เช่นlibsqlite3-dev) และแอปพลิเคชันแพคเกจที่เกี่ยวข้อง (เช่นsqlite3) ติดตั้งแล้วระบบส่วนใหญ่จะติดตั้งแพคเกจแอปพลิเคชันที่เกี่ยวข้องโดยอัตโนมัติในเวลาเดียวกัน

เมื่อการกำหนดค่ารันสำเร็จผลลัพธ์จะเป็นว่ามันจะสร้างไฟล์อย่างน้อยหนึ่งไฟล์ โดยทั่วไปไฟล์เหล่านี้จะตั้งชื่อMakefile(จำไว้ว่าชื่อไฟล์มีความสำคัญใน Unix / Linux!) หากแพ็คเกจการสร้างมีไดเรกทอรีย่อยเช่นsrcฯลฯ แต่ละไดเรกทอรีย่อยเหล่านี้จะมีMakefileเช่นกัน

ข้อผิดพลาดในการสร้างและการรวบรวม

ตอนนี้เราพร้อมที่จะรวบรวมแอปพลิเคชันจริงแล้ว สิ่งนี้มักเรียกว่าการสร้างและชื่อนั้นยืมมาจากกระบวนการโลกแห่งการสร้างบางสิ่งบางอย่าง "ชิ้นส่วน" ของแอปพลิเคชั่นซึ่งโดยทั่วไปจะเป็นไฟล์ซอร์สโค้ดหลายไฟล์ถูกรวมเข้าด้วยกันเพื่อสร้างแอปพลิเคชันโดยรวม ยูทิลิตี make จะจัดการกระบวนการสร้างและเรียกใช้แอปพลิเคชันอื่นเช่นคอมไพเลอร์และลิงเกอร์เพื่อทำงานจริง ในกรณีส่วนใหญ่คุณเพียงแค่เรียกใช้ make (ด้วยบัญชีผู้ใช้ปกติของคุณ) จากไดเรกทอรีที่คุณรันการกำหนดค่า (ในบางกรณีเช่นการรวบรวมแอปพลิเคชันที่เขียนด้วยไลบรารี Qt คุณจะต้องเรียกใช้แอปพลิเคชั่น "wrapper" อื่น ๆ เช่น qmake แทนตรวจสอบรายละเอียดREADMEและ / หรือINSTALLเอกสารทุกครั้ง)

เช่นเดียวกับสคริปต์การกำหนดค่าด้านบนเมื่อคุณเรียกใช้ make (หรือยูทิลิตี้ที่คล้ายกัน) ในเทอร์มินัลมันจะแสดงข้อความบางอย่างเกี่ยวกับสิ่งที่กำลังดำเนินการและคำเตือนและข้อผิดพลาดใด ๆ โดยทั่วไปคุณสามารถเพิกเฉยต่อคำเตือนเนื่องจากเป็นส่วนใหญ่สำหรับนักพัฒนาแอปพลิเคชันและกำลังบอกพวกเขาว่ามีวิธีปฏิบัติมาตรฐานบางอย่างที่ถูกละเมิด โดยปกติแล้วคำเตือนเหล่านี้จะไม่ส่งผลกระทบต่อฟังก์ชันแอปพลิเคชัน ในทางตรงกันข้ามข้อผิดพลาดของคอมไพเลอร์จะต้องได้รับการจัดการ เมื่อใช้ Newsbeuter เมื่อฉันทำสิ่งต่างๆมาเป็นระยะเวลาหนึ่งแล้วฉันก็พบข้อผิดพลาด:

tester@sitlabcpu22:~/download/newsbeuter-1.3$ make
...
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/configparser.o -c src/configparser.cpp
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/colormanager.o -c src/colormanager.cpp
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:5:18: error: stfl.h: No such file or directory
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:33: error: ISO C++ forbids declaration of \u2018stfl_form\u2019 with no type
./include/stflpp.h:33: error: expected \u2018;\u2019 before \u2018*\u2019 token
./include/stflpp.h:34: error: ISO C++ forbids declaration of \u2018stfl_ipool\u2019 with no type
./include/stflpp.h:34: error: expected \u2018;\u2019 before \u2018*\u2019 token
make: *** [src/colormanager.o] Error 1

กระบวนการทำให้จะหยุดทันทีที่พบข้อผิดพลาดแรก การจัดการข้อผิดพลาดของคอมไพเลอร์บางครั้งอาจเป็นเรื่องยุ่งยาก คุณต้องดูข้อผิดพลาดสำหรับเบาะแสบางอย่างเกี่ยวกับปัญหา โดยทั่วไปปัญหาคือไฟล์ส่วนหัวบางไฟล์ซึ่งมักจะมีนามสกุล.hหรือ.hppหายไป ในกรณีที่มีข้อผิดพลาดข้างต้นเป็น (หรือควรเป็น!) ชัดเจนว่าปัญหาคือstfl.hไม่พบไฟล์ส่วนหัว ดังที่ตัวอย่างนี้แสดงขึ้นมาคุณต้องการดูบรรทัดแรกของข้อความแสดงข้อผิดพลาดและหาทางแก้ไขเพื่อหาสาเหตุของปัญหา

หลังจากดูเอกสารของ Newsbeuter (ซึ่งฉันควรทำก่อนที่ฉันจะเริ่ม แต่ส่วนหนึ่งของบทช่วยสอนนี้ไม่มีความหมายมาก!) ฉันพบว่ามันต้องมีห้องสมุดบุคคลที่สามที่เรียกว่า STFL แล้วเราจะทำอย่างไรในกรณีนี้? ทีนี้เราก็ทำซ้ำกระบวนการเดียวกันนี้สำหรับไลบรารีที่ต้องการนั้น: ขอรับไลบรารีและดำเนินการกระบวนการกำหนดค่า - บิลด์ - ติดตั้งสำหรับมันและจากนั้นสร้างแอปพลิเคชันที่ต้องการต่อ ตัวอย่างเช่นในกรณีของ STFL ฉันต้องติดตั้งlibncursesw5-devแพ็กเกจเพื่อสร้างอย่างถูกต้อง (โดยปกติไม่จำเป็นต้องทำซ้ำขั้นตอนการกำหนดค่าในแอปพลิเคชันเดิมของเราหลังจากติดตั้งแอปพลิเคชันอื่นที่จำเป็น แต่ไม่เคยเจ็บอย่างใดอย่างหนึ่ง)

หลังจากติดตั้งชุดเครื่องมือ STFL สำเร็จกระบวนการสร้างสำหรับ Newsbeuter จะทำงานได้สำเร็จ โดยทั่วไปกระบวนการสร้างจะเลือกตำแหน่งที่จะปิด (ที่จุดของข้อผิดพลาด) ดังนั้นไฟล์ใด ๆ ที่คอมไพล์แล้วสำเร็จจะไม่ถูกคอมไพล์ใหม่ หากคุณต้องการคอมไพล์ทุกสิ่งใหม่คุณสามารถเรียกใช้ make clean all เพื่อลบออบเจ็กต์ที่รวบรวมแล้วเรียกใช้ make อีกครั้ง

การติดตั้ง

หลังจากกระบวนการสร้างเสร็จสมบูรณ์คุณก็พร้อมที่จะติดตั้งแอปพลิเคชัน ในกรณีส่วนใหญ่หากต้องการติดตั้งแอปพลิเคชันไปยังพื้นที่ทั่วไปของระบบไฟล์ (เช่น/usr/binหรือ/usr/share/binอื่น ๆ ) คุณจะต้องเรียกใช้การติดตั้งในฐานะรูท การติดตั้งเป็นขั้นตอนที่ง่ายที่สุดในกระบวนการทั้งหมด ในการติดตั้งในการรันเทอร์มินัล:

$ make install

ตรวจสอบผลลัพธ์ของกระบวนการนี้เพื่อหาข้อผิดพลาด หากทุกอย่างประสบความสำเร็จคุณควรจะสามารถเรียกใช้ชื่อคำสั่งในเทอร์มินัลและมันจะเปิดตัว (ผนวก & ต่อท้ายบรรทัดคำสั่งหากเป็นแอปพลิเคชั่น GUI มิฉะนั้นคุณจะไม่สามารถใช้เซสชันเทอร์มินัลจนกว่าแอปพลิเคชันจะทำงานเสร็จสิ้น)

เมื่อคุณสร้างแอปพลิเคชันจากแหล่งที่มาโดยทั่วไปจะไม่เพิ่มไอคอนหรือทางลัดไปยังเมนู GUI ใน Ubuntu คุณจะต้องเพิ่มสิ่งนี้ด้วยตนเอง

และนั่นเป็นกระบวนการแม้ว่าจะซ้ำไปซ้ำมาเพื่อสร้างและติดตั้งแอปพลิเคชันจากแหล่งใน Ubuntu หลังจากที่คุณทำสิ่งนี้เพียงไม่กี่ครั้งมันจะกลายเป็นเรื่องปกติสำหรับคุณ!


ทิมฉันอยากอ่านบทช่วยสอนของคุณ แต่ลิงก์ที่คุณโพสต์ไม่ทำงาน
gareth_bowles

6

ดี. / กำหนดค่า - ช่วยให้คุณได้รับข้อมูลจำนวนมากสำหรับ GNU autotools สร้างไฟล์กำหนดค่า ส่วนใหญ่มาจาก - กับ / - โดยไม่ต้องเปิดใช้งานคุณสมบัติ (สิ่งเหล่านี้อาจใช้พารามิเตอร์พิเศษเช่น "แชร์" เพื่อบอกตำแหน่งที่จะหาห้องสมุด)

สิ่งสำคัญอื่น ๆ คือ --prefix (ซึ่งเป็นค่าเริ่มต้นที่ / usr / local / ส่วนใหญ่) เพื่อบอกตำแหน่งที่จะติดตั้ง (ถ้าคุณกำลังสร้างแพ็คเกจคุณมักจะต้องการสิ่งนี้เป็น --prefix = / usr หรืออาจ --prefix = / opt / YourPackage)

บน Linux, / lib, / usr / lib และ / usr / local / lib จะค้นหา gcc ของฉันและรวมอยู่ในการกำหนดค่าเริ่มต้นของ ldconfig ถ้าคุณไม่มีเหตุผลที่ดีนี่คือที่ที่คุณต้องการห้องสมุดของคุณ /etc/ld.so.conf อาจแสดงรายการพิเศษอย่างไรก็ตาม

กำหนดค่าและทำการค้นหาโดยเพียงแค่พยายามเรียกใช้ "gcc -l" และดูว่ามีข้อผิดพลาด คุณสามารถเพิ่ม "-L" ให้กับพารามิเตอร์ CFLAGS ของคุณเพื่อเพิ่มเส้นทางเพิ่มเติมเพื่อค้นหา

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

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

ls -l เป็นทางออกที่ดีที่สุดในการค้นหาห้องสมุดที่ติดตั้ง

และนั่นคือสิ่งที่ฉันขาดข้อมูล จะเล่นกับแพ็คเกจได้อย่างไร: ไม่รู้ เมื่อเป็นไปได้ฉันพยายามห่อสิ่งต่าง ๆ ไว้ในแพ็คเกจเพื่อหลีกเลี่ยงปัญหา


4

"ฉันจะทราบได้อย่างไรว่าอาร์กิวเมนต์ใดที่จะส่งผ่านไปยัง. / กำหนดค่า"

โดยปกติ: ./configure - ช่วยให้จะบอกสิ่งที่คุณต้องการมี

"ฉันจะบอกได้อย่างไรว่าห้องสมุดใดที่ฉันได้ติดตั้งและเวอร์ชันใด"

ขึ้นอยู่กับระบบ วิธีหนึ่งคือเพียงทำfind /|grep libname|lessไฟล์ไลบรารีโดยทั่วไปมีเวอร์ชันในชื่อไฟล์

"ฉันจะติดตั้งไลบรารีมากกว่าหนึ่งเวอร์ชันโดยไม่ทำให้ระบบปกติเสียหายได้อย่างไร"

อีกครั้งขึ้นอยู่กับระบบและห้องสมุด sudo make altinstallจะสร้างชื่อเวอร์ชันสำหรับคุณ ไฟล์ไลบรารี่รุ่นทั่วไป อย่างไรก็ตามโปรดทราบ; ตั้งแต่รุ่นมักจะสร้าง symlink เป็นชื่อ "ปกติ" นี้สามารถทำลายสิ่งต่าง ๆ

"ถ้าฉันกำลังติดตั้งสิ่งต่าง ๆ จากแหล่งข้อมูลบนระบบที่จัดการโดยใช้แพ็คเกจเป็นวิธีที่สะอาดที่สุดในการทำเช่นนั้น"

การใช้พารามิเตอร์ --prefix ใน ./configure และวางไว้ที่ใดที่หนึ่ง/optเป็นการปฏิบัติที่ดีในการติดตาม

คำเตือน:ฉันไม่ได้เป็นผู้เชี่ยวชาญ แต่ฉันใช้ linux มานานกว่า 5 ปีจาก cmd line (slackware, CentOS, redhat, ubuntu, misc อื่น ๆ และ OS X)


4

เพื่อตอบคำถามของคุณฉันพบวิธีที่ดีในวันอื่น ๆ เพื่อดูว่าคุณได้ติดตั้งไลบรารี่ใดและไลบรารี่ใด (นี่คือ Linux Debian ดังนั้นควรทำงานกับเวอร์ชันอื่นด้วย)

dpkg --list

คุณควรจะได้ลิสต์ที่ยาวมากพร้อมกับเอาท์พุทแบบนี้

ii  libssl0.9.8    0.9.8c-4etch5  SSL shared libraries
ii  libssp0        4.1.1-21       GCC stack smashing protection library
ii  libstdc++5     3.3.6-15       The GNU Standard C++ Library v3
ii  libstdc++5-3.3 3.3.6-15       The GNU Standard C++ Library v3 (development
ii  libstdc++6     4.1.1-21       The GNU Standard C++ Library v3

4

ไซมอน

1. ) ./configure - ช่วยให้ข้อมูลจำนวนมาก ฉันขอแนะนำให้ตรวจสอบมัน โดยทั่วไปมีตัวเลือกสำหรับการรวบรวมไลบรารีแบบสแตติก / ลิงก์แบบไดนามิกเมื่อเหมาะสม

2. ) Libaries อาศัยอยู่ในเส้นทางลิงเกอร์แบบไดนามิก ซึ่งมักจะถูกตั้งค่าใน /etc/ld.so.conf ตัวลิงก์จะค้นหาไลบรารีที่เหมาะสมเช่นเดียวกับตัวแปรสภาพแวดล้อม PATH ที่ตรงกับอันแรกที่พบ

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

4. ) มันยากไปหน่อย คุณต้องตรวจสอบเส้นทางห้องสมุดของคุณเพื่อให้แน่ใจอย่างแน่นอนโดยทั่วไปห้องสมุดจะมีลิงค์สัญลักษณ์ไปยังเวอร์ชันที่ติดตั้งไว้

เช่น libssh2.so.1 -> libssh2.so.1.0.0

โดยทั่วไปแล้วคนจัดการห้องสมุดและโปรแกรมที่พวกเขาติดตั้งโดยการกลิ้งแพ็คเกจเดเบียนของพวกเขาเองหรือใช้เทคนิคอื่น ๆ ฉันจัดการซอฟต์แวร์ที่ติดตั้งโดยใช้ stow ( http://www.gnu.org/software/stow/ ) ซึ่งง่ายมากและติดตั้งไลบรารีโดยใช้ลิงก์สัญลักษณ์ ฉันพบว่าง่ายขึ้นเนื่องจากฉันไม่ต้องสร้าง / ติดตั้ง / ทดสอบแพ็คเกจ deb / rpm

5. ) ไลบรารีหลายรุ่นสามารถติดตั้งได้ตามปกติในไดเรกทอรีของห้องสมุด ไลบรารี่ที่เชื่อมโยงกับไฟล์เอ็กซีคิ้วท์จะยังคงเชื่อมโยงกับเวอร์ชั่นที่ลิงค์ไปด้วย การเรียกใช้ ldd บนไฟล์เรียกทำงานจะบอกคุณว่าไลบรารีใดที่ไฟล์ปฏิบัติการเชื่อมโยงอยู่

6. ) อย่างที่ฉันได้กล่าวไปแล้วการม้วนแพ็คเกจเดเบียนของคุณเองหรือการใช้สโตว์น่าจะเป็นวิธีที่สะอาดที่สุด

7. ) ฉันไม่สามารถพูดกับ Mac OSX ได้จริง แต่สำหรับ Linux ระบบบรรจุภัณฑ์ของการกระจายเป็นวิธีที่ดีที่สุด

8. ) อาจมีความยุ่งยากมากมายที่จะได้รับการแก้ไขโดยใช้ ldd และค้นหาว่ามีบางสิ่งเชื่อมโยงกับรุ่นใดหรือไลบรารีใดที่เชื่อมโยงกับแฟ้มที่ปฏิบัติการไม่พบ pkg-config จะช่วยคุณได้มาก แต่สำหรับซอฟต์แวร์ที่ใช้งานเท่านั้น มันไม่ได้เป็นส่วนหนึ่งของระบบสร้าง autotools เริ่มต้นแม้ว่าจะเป็นที่นิยมในปัจจุบัน


4

ไลบรารีแบบคงที่ไม่ใช่แนวคิดที่ดี - หากคุณต้องการอัพเกรดไลบรารี (เพื่อแก้ไขปัญหาด้านความปลอดภัย) คุณจะต้องคอมไพล์ทุกสิ่งใหม่ด้วยการพึ่งพาไลบรารีนั้น

ฉันไม่ชอบความคิดที่ว่า "ทำการติดตั้ง" อาจทำให้ระบบของฉันยุ่งเหยิง แต่อย่างที่คนอื่นบอกว่ามันมักจะเจ็บปวดน้อยกว่าในการติดตั้งสิ่งต่าง ๆ ใน / usr / local แทนที่จะใช้ --prefix เพื่อติดตั้งที่อื่น ดังนั้นฉันจึงขอร้อง / usr / local ให้กับผู้ใช้ปกติ (ไม่มีสิทธิ์) วิธีนี้ "ทำให้การติดตั้ง" ค่อนข้างรับประกันได้ว่าจะไม่ยุ่งกับไฟล์ระบบที่สำคัญ (สิ่งนี้เห็นได้ชัดว่าใช้งานไม่ได้กับระบบที่มีผู้ใช้หลายคนมันยอดเยี่ยมสำหรับเซิร์ฟเวอร์เสมือน)


4

แม้ว่ามันจะไม่ชัดเจนในรายการคำถามของคุณคุณพูดถึงในคำนำของคุณ:

./configure && make && sudo make install มักจะเพียงพอ แต่บางครั้งก็ใช้งานไม่ได้และเมื่อไม่เป็นเช่นนั้นฉันก็ติดอยู่บ่อยครั้ง

เมื่อฉันติดบน Debian หรือ Ubuntu ฉันจะใช้ apt อัตโนมัติซึ่งจะติดตั้งแพคเกจที่มีไฟล์ที่กำหนดค่าหาอัตโนมัติ

ดู:

เครื่องมืออื่นที่คุณอาจพบว่ามีประโยชน์คือ CheckInstall ซึ่งจะเพิ่มแอปพลิเคชันที่ติดตั้งไว้make installในรายการแพ็คเกจที่ติดตั้งของคุณ: https://help.ubuntu.com/community/CheckInstall


3

สำหรับ OS X:

  • ฉันจะทราบได้อย่างไรว่าอาร์กิวเมนต์ใดที่ต้องส่งผ่านไปยัง. / config

./configure - ช่วย

  • อะไรคือความแตกต่างที่แท้จริงระหว่างไลบรารีที่แบ่งใช้และไลบรารีที่เชื่อมโยงแบบสแตติก เหตุใดฉันจึงไม่สามารถลิงก์ทุกอย่างแบบคงที่ (RAM และพื้นที่ดิสก์มีราคาถูกในปัจจุบัน) และหลีกเลี่ยงข้อขัดแย้งของเวอร์ชันไลบรารีแปลก ๆ

การใช้ไลบรารีที่แบ่งใช้ทำให้คุณสามารถอัพเกรดไลบรารีได้โดยไม่ต้องรวบรวมทุกสิ่งที่ใช้งานใหม่

  • วิธีการที่ห้องสมุดที่ใช้ร่วมกันทำงานภายใต้ OS X / Linux - ที่ที่พวกเขาอาศัยอยู่ในระบบไฟล์วิธีการ. / กำหนดค่า && หาพบพวกเขาสิ่งที่เกิดขึ้นจริงเมื่อพวกเขาเชื่อมโยงกับ

ไลบรารีระบบใช้งานใน / usr / lib

ไลบรารี่ที่คุณรวบรวมไว้จะอยู่ใน / usr / local / lib (/ usr / local เป็นแฟล็ก --prefix แฟล็กสำหรับ ./configure)

ตัวแปรสภาพแวดล้อม DYLD_FALLBACK_LIBRARY_PATH และ LD_LIBRARY_PATH ช่วยให้คุณระบุโฟลเดอร์ที่ต้องการค้นหาดังนั้น / usr / local / lib ควรอยู่ที่จุดเริ่มต้นของรายการ

  • ฉันจะติดตั้งไลบรารีมากกว่าหนึ่งเวอร์ชันโดยไม่ทำให้ระบบปกติเสียหายได้อย่างไร

ติดตั้งทุกอย่างเพื่อ / usr / local - ด้วยตัวแปรสภาพแวดล้อมด้านบนเวอร์ชันใน / usr / local / lib จะมีความสำคัญเหนือกว่าเวอร์ชันใน / usr / lib ในสภาพแวดล้อมของคุณ

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

ติดตั้งเพื่อ / usr / local ใน Ubuntu ฉันลองใช้ checkinstall ก่อนเพื่อสร้างแพ็คเกจ deb

  • สมมติว่าฉันจัดการเพื่อรวบรวมบางสิ่งบางอย่างเที่ยวยุ่งยิ่งจากแหล่งที่มาฉันจะแพคเกจที่ขึ้นเพื่อให้คนอื่นไม่ต้องกระโดดผ่านห่วงเดียวกัน โดยเฉพาะอย่างยิ่งใน OS X ....

เอกสารขั้นตอนการรวบรวมในโพสต์บล็อกฉันพูด

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