linux ของฉันจะทำงานบน distros ทั้งหมดหรือไม่


24

ฉันพบ IDE ที่ดีทดแทนสำหรับ Delphi เรียกว่า Lazarus แต่ฉันไม่มีคำถามสำหรับโปรแกรมเมอร์ ลินุกซ์ไบนารีที่เชื่อมโยงแบบสแตติก

จะทำงานกับการแจกแจง Linux ทั้งหมดหรือไม่ นั่นคือมันไม่สำคัญว่าลินุกซ์ distro ใดที่ฉันสร้างขึ้นและมันจะทำงานบน Debian / ArchLinux / Ubuntu / OpenSUSE / ... อะไรก็ตาม? จากการค้นพบของฉันจริง ๆ แล้วมีความสำคัญกับ 32 บิตหรือ 64 บิตเท่านั้น ฉันต้องการให้แน่ใจก่อนที่จะเผยแพร่



คุณสามารถระบุประเภทของห้องสมุดที่คุณต้องการเชื่อมโยงโปรแกรมด้วย บางไลบรารีมีการขึ้นต่อกันที่ซ่อนอยู่ (ไฟล์ข้อมูลระบบย่อยแบบไดนามิก) หรือมีข้อสันนิษฐานเกี่ยวกับระบบที่กำลังทำงานอยู่
Thomas Erker

คำตอบ:


29

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


สำหรับสิ่งที่มีความซับซ้อนกว่าโลกสวัสดีเชื่อมโยงแบบคงคำตอบคืออาจจะไม่มี
โดยไม่ต้องทดสอบเกี่ยวกับการกระจาย X สมมติคำตอบคือไม่มีเอ็กซ์

หากคุณต้องการจัดส่งซอฟต์แวร์ของคุณในรูปแบบไบนารีให้ จำกัด ตัวเองไว้

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

  • รุ่นล่าสุดหนึ่งหรือสองรุ่น

มิฉะนั้นคุณจะพบกับการกระจายที่ไม่เหมาะสมทุกขนาดรุ่นและอายุ (การแจกจ่ายอายุสิบปียังคงใช้งานและสนับสนุนอยู่)

ทดสอบสำหรับสิ่งเหล่านั้น เพียงไม่กี่ตัวชี้ในสิ่งที่สามารถ (และจะ) ผิดอย่างอื่น:

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

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

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

  • 32 บิตบน 64 บิต: สภาพแวดล้อม 32 บิตอาจไม่ได้รับการติดตั้งหรือบางไลบรารี 32 บิตที่ไม่จำเป็นถูกย้ายไปยังแพ็คเกจเพิ่มเติมนอกเหนือจากสภาพแวดล้อม 32on64 ดังนั้นคุณจึงมีการพึ่งพาเป็นพิเศษสำหรับกรณีนี้

  • Shell: อย่าถือว่า Bash เวอร์ชันของคุณ อย่าคิดแม้แต่ Bash

  • เครื่องมือ: อย่าสันนิษฐานว่ามีเครื่องมือบรรทัดคำสั่งที่ไม่ใช่ POSIX อยู่ทุกที่

  • เครื่องมือ: อย่าถือว่าเครื่องมือจดจำตัวเลือกเพียงเพราะเวอร์ชั่นของ GNU distro ของคุณทำ

  • ส่วนต่อประสานเคอร์เนล: อย่าถือว่ามีอยู่หรือโครงสร้างของไฟล์/procเพราะมันมีอยู่ / มีโครงสร้างในเครื่องของคุณ

  • Java: คุณแน่ใจหรือไม่ว่าโปรแกรมของคุณทำงานบน JRE ของ IBM ในฐานะที่มาพร้อมกับ SLES โดยไม่ต้องทดสอบ

โบนัส:

  • ชุดคำสั่ง: ไบนารีที่คอมไพล์บนเครื่องของคุณไม่ทำงานบนฮาร์ดแวร์รุ่นเก่า

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

  • ความปลอดภัย: คุณเปลี่ยนความรับผิดชอบในการอัปเดตไลบรารีจากผู้ใช้ซอฟต์แวร์เป็นตัวคุณเอง

  • ขนาดและความซับซ้อน: เพื่อความสนุกลองสร้างโปรแกรม GUI ที่เชื่อมโยงแบบสแตติก

  • ความสามารถในการทำงานร่วมกัน: หากซอฟต์แวร์ของคุณเป็น "ปลั๊กอิน" ทุกชนิดคุณต้องพึ่งพาซอฟต์แวร์ที่โทรหาคุณ

  • การออกแบบห้องสมุด: หากคุณเชื่อมโยงโปรแกรมของคุณกับ GNU libc และใช้บริการชื่อ ( getpwnam()ฯลฯ ) คุณจะได้รับการเชื่อมโยงแบบไดนามิกกับ NSS ของ libc (สวิตช์บริการชื่อ)

  • การออกแบบห้องสมุด: ไลบรารีที่คุณเชื่อมโยงโปรแกรมของคุณกับการใช้ไฟล์ข้อมูลหรือทรัพยากรอื่น ๆ (เช่นเขตเวลาหรือตำแหน่งที่ตั้ง)


ด้วยเหตุผลทั้งหมดที่กล่าวมาการทดสอบเป็นสิ่งจำเป็น

  • ทำความคุ้นเคยกับ KVM หรือเทคนิคการจำลองเสมือนอื่น ๆ และรับ VM ของการแจกจ่ายทุกอย่างที่คุณวางแผนที่จะสนับสนุน ทดสอบซอฟต์แวร์ของคุณบน VM ทุกเครื่อง

  • ใช้การติดตั้งน้อยที่สุดของการแจกแจงเหล่านั้น

  • สร้าง VM ด้วยชุดคำสั่งแบบ จำกัด (เช่นไม่มี SSE 4)

  • เชื่อมโยงแบบคงที่หรือรวมเท่านั้น: ตรวจสอบไบนารีของคุณด้วยlddเพื่อดูว่าพวกเขามีการเชื่อมโยงแบบคงที่ / ใช้จริงเท่านั้นห้องสมุดรวมของคุณ

  • เชื่อมโยงแบบคงที่หรือรวมเท่านั้น: สร้างไดเรกทอรีว่างและคัดลอกซอฟต์แวร์ของคุณลงในมัน chrootในไดเรกทอรีนั้นและเรียกใช้ซอฟต์แวร์ของคุณ


นั่นเป็นคำตอบที่ครบวงจร +1
sirlark

2
Shell: โดยเฉพาะDebian ไม่ได้ใช้ bashและเนื่องจากช่องโหว่ Shellshock บนระบบ Debian นั้นลดลงอย่างมากฉันไม่สามารถจินตนาการได้ว่ามันจะเปลี่ยนแปลงในอนาคตอันใกล้
เควิน

1
นอกจากนี้ถ้าคุณต้องการที่จะไบนารีเรือเชื่อมโยงพวกเขาแบบคงที่
253751

ทำไม "ชุดคำสั่ง" เรียกว่า "โบนัส" หากคุณเผยแพร่ในรูปแบบไบนารีคุณต้องพิจารณาว่า ISAs ใดที่คุณจะรวบรวม คุณอาจไม่สนใจผู้ใช้ m68k แต่เป็นเรื่องยากที่จะเพิกเฉยต่อ ARM, IA32 และ X86_64 อย่างน้อย
Toby Speight

@TobySpeight ให้นึกถึง SSE4 และเช่นนั้น อาจกัดคุณถ้าคุณใช้แอสเซมเบลอร์
Thomas Erker

9

คำตอบมันขึ้นอยู่กับ แต่โดยส่วนใหญ่แล้วใช่ตราบใดที่ติดตั้งไลบรารีที่จำเป็นบนระบบปฏิบัติการ

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


2

คำตอบเส็งเคร็งแรก:ขึ้นอยู่กับ

หากคุณกำลังปล่อยไบนารีสมมติคำตอบเป็น "ไม่" จนกว่าคุณจะได้กระจายทุก libs ที่ว่ามันเคยเกี่ยวข้องกับมัน (จากพื้นดินขึ้นซึ่งเป็นที่น่ารำคาญจนกว่าคุณจะให้ระบบมากจริงๆที่ยืนอยู่บนอยู่แล้วของตัวเอง ) หรือลิงก์แบบสแตติกเทียบเท่า

... แต่พ่อมดและเงินและพ่อมดเงิน ...

IBM มีตัวติดตั้ง "Unixish ทั่วไป" บางตัวที่ทำให้ฉันตกตะลึงด้วยการทำงานทุกที่ที่ฉันลอง: Linuces หลายตัวจากเคอร์เนลหลายรุ่น OpenSolaris (หรืออะไรก็ตามที่เรียกว่าตอนนี้) Solaris และ BSD แต่มันมีขนาดใหญ่มาก และสิ่งที่พวกเขาให้มีขนาดใหญ่เท่ากัน ไม่มีโปรแกรมแข่งรถเล็ก ๆ น้อย ๆ ที่ได้รับการเผยแพร่ด้วยวิธีนี้เพียงแค่ประเภทขององค์กรขนาดใหญ่ที่คุณคาดหวังจาก IBM

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

แต่...

ฉันแจกจ่ายซอฟต์แวร์เป็นแหล่งที่มาพร้อมกับยูทิลิตีบิลด์ ฉันทำสิ่งนี้ใน C, Erlang, Python, Guile และอื่น ๆ ซึ่งทำให้ฉันมีความยืดหยุ่นมากขึ้นเกี่ยวกับว่ามันจะทำงานหรือไม่และมันง่ายกว่ามากในการเขียน buildscript ที่ทำให้แน่ใจว่าสิ่งที่ถูกต้องมีอยู่ในเวลาสร้างมากกว่า ตรวจสอบให้แน่ใจว่าทุกอย่างเข้าที่รันไทม์ เมื่อมีอยู่แล้วมันเป็นเรื่องสำคัญที่จะเขียนตัวอัปเดตอัตโนมัติสำหรับโปรแกรมของคุณหากคุณแจกจ่ายแหล่งที่มา: แหล่งที่มามักจะมีขนาดเล็กกว่าไบนารีซึ่งรวมถึง deps ทั้งหมดและความบ้าอื่น ๆ การใช้วิธีนี้ฉันไม่ได้มีปัญหามากในการปรับใช้กับ Unices อย่างแน่นอน (และบางครั้ง Windows แต่นั่นก็เป็นงานที่น่าเบื่อมากกว่า)

เล่นลูกอย่างเพียงพอแขนตัวเอง!

เมื่อคุณเริ่มจริงจังเช่นเดียวกับ srsly srs เกี่ยวกับการปรับให้เหมาะสมอย่างราบรื่นภายในโลก Linux คุณจะแจกจ่ายแหล่งข้อมูล C หรือเปลี่ยนเป็นสภาพแวดล้อมที่มีการจัดการอย่างสมบูรณ์เพื่อภาษาที่น่าพอใจที่แฮ็คที่สร้างไว้ล่วงหน้าแล้ว ตัวอย่างเช่นถ้าคุณกำลังเขียนโค้ด Python คุณสามารถตรวจสอบเวอร์ชันและรู้ว่าคุณใช้งาน CPython เวอร์ชันไหนและโดยทั่วไปคาดว่าจะมีบางเวอร์ชั่นที่ใช้งานร่วมกันได้บน Linux ที่ระบุ (และนี่เป็นการตรวจสอบที่ง่ายกว่า C libs / รุ่นที่คุณอาจใช้) Erlang, Guile, Python, Perl, CL และอื่น ๆ ล้วนแล้วแต่เป็นสิ่งที่ดี เป้าหมายง่าย ๆ สำหรับการปรับใช้ประเภทนี้และหลาย ๆ แห่งมีพื้นที่เก็บข้อมูลส่วนกลางเช่น CPAN หรือ pip (หรืออะไรก็ตาม) ที่ผู้ใช้สามารถเรียกใช้คำสั่งเพื่อดึงแหล่งข้อมูลที่เซ็นชื่อด้วยตนเองเมื่อต้องการและรู้ว่าสิ่งต่าง ๆ จะทำงานตามที่คุณต้องการ .

[ภาคผนวก: 1. แม้แต่แฮสเค็ลล์ก็สามารถดึงสิ่งนี้ออกทาง Cabal ได้แม้ว่าฉันจะระมัดระวังในการใช้งานในสภาพแวดล้อมการผลิต 2. มีกลยุทธ์การปรับใช้ "ปล่อย" ที่แตกต่างกันโดยสิ้นเชิงกับ Erlang ที่รับประกันว่ารหัสของคุณจะมีสภาพแวดล้อมที่สมบูรณ์รอบตัว 3. Python ก้าวไปอีกขั้นกับสภาพแวดล้อมเสมือนจริง Runtimes ไม่ทั้งหมดช่วยคุณได้มาก]

บิตสุดท้ายนี้เกี่ยวกับสภาพแวดล้อมที่มีการจัดการบน Linux นั้นยอดเยี่ยมมาก และเป็นโบนัสจะช่วยให้คุณสามารถกำหนดการพึ่งพาทั่วไปได้มากขึ้นแก้ไขโดยอัตโนมัติโดยไม่ต้องใช้ความพยายามใด ๆ เป็นพิเศษโดยไม่ต้องเขียนแพ็คเกจต่อ distro และคุณสามารถหยุดการดูแลได้ว่าระบบ 32 หรือ 64 บิต (โดยทั่วไปแล้ว)

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