ฉันควรใช้ libc ++ หรือ libstdc ++? [ปิด]


92

ฉันกำลังพัฒนาไฟล์ปฏิบัติการอินเตอร์เฟสบรรทัดคำสั่งสำหรับทั้ง osx และ linux โดยใช้ c / c ++ โครงการจะเชื่อมโยงกับ opencv ฉันควรใช้ libc ++ หรือ libstdc ++?


1
ฉันไม่รู้ แต่คุณอาจสนใจสิ่งนี้: clang-developers.42468.n3.nabble.com/…
DarenW

3
คำตอบนี้อาจเป็นประโยชน์
Yantao Xie

2
หากคุณเชื่อมโยงกับ opencv ให้ใช้ libstdc ++ นี่คือเหตุผลstackoverflow.com/questions/13037659/…
Loozie

คำตอบ:


91

ฉันจะใช้ไลบรารีดั้งเดิมสำหรับแต่ละระบบปฏิบัติการเช่น libstdc ++ บน GNU / Linux และ libc ++ บน MacOS X

libc ++ ยังไม่สมบูรณ์ 100% บน GNU / Linux และไม่มีข้อได้เปรียบที่แท้จริงในการใช้งานเมื่อ libstdc ++ สมบูรณ์กว่า นอกจากนี้หากคุณต้องการเชื่อมโยงไปยังไลบรารีอื่น ๆ ที่เขียนด้วย C ++ พวกเขาเกือบจะถูกสร้างขึ้นด้วย libstdc ++ ดังนั้นคุณจะต้องเชื่อมโยงด้วยเพื่อใช้

ข้อมูลเพิ่มเติมที่นี่เกี่ยวกับความสมบูรณ์ของ libc ++ บนแพลตฟอร์มต่างๆ


3
คุณช่วยอธิบาย / ให้ลิงค์เกี่ยวกับสถานะความสมบูรณ์ของ libc ++ บน Linux ได้ไหม ฉันไม่ค่อยเข้าใจว่าทำไมสิ่งนี้ถึงเจาะจงแพลตฟอร์มเนื่องจาก libc ++ เป็นเพียงส่วนหัวของ Standard Library หรือคุณหมายความว่าต้องสร้างไลบรารีรันไทม์ Clang wrt to LLVM ที่ไม่ได้รับการสนับสนุนอย่างดีบน Linux?
TemplateRex

1
@TemplateRex ผมไม่ทราบว่าสถานะปัจจุบันคุณสามารถดูlibcxx.llvm.org ฉันไม่ได้ติดตาม libc ++ ดังนั้นคุณกำลังถามคนผิด แต่คุณกำลังแนะนำว่า "ส่วนหัวของไลบรารีมาตรฐานจำนวนมาก" จะไม่มีรหัสเฉพาะแพลตฟอร์มเลยหรือ
Jonathan Wakely

เนื่องจากคุณสามารถติดตั้ง Linux บนฮาร์ดแวร์ของ Apple ที่ใช้ MacOS X ได้ฉันจึงสงสัยว่าการพึ่งพาแพลตฟอร์มในส่วนหัว C ++ มาจากไหน? บางทีการห่อหุ้มรอบ ๆ ภายใน CPU ในตัวหรือ IO และการจัดการข้อยกเว้นขึ้นอยู่กับระบบ แต่ความเข้าใจของฉันคือสิ่งเหล่านี้ได้รับการจัดการในประเภทไบนารีเลเยอร์ librcxxrt ส่วนหัวของ Standard Library ไม่ควรจะเสียบได้มากหรือน้อย?
TemplateRex

5
ฉันไม่ได้พูดถึงฮาร์ดแวร์ อีกครั้งฉันไม่รู้เกี่ยวกับ libc ++ แต่ไลบรารีมาตรฐาน C ++ ส่วนใหญ่ถูกนำไปใช้บนไลบรารี C ของ OS และเช่นการแมปจากstd::ctype_base::maskค่าเป็นค่า<ctype.h>คงที่ขึ้นอยู่กับแพลตฟอร์มทั้งหมด (ตัวประมวลผลภายในของ CPU จัดเตรียมโดยคอมไพเลอร์การจัดการข้อยกเว้นทำได้โดยเลเยอร์ ABI ระดับต่ำ แต่โดยทั่วไปแล้ว IO จะทำทั้งหมดในไลบรารี C ++ และ C ไม่ใช่สิ่งที่อยู่ในระดับต่ำ)
Jonathan Wakely

1
@abergmeier นั่นเป็นอาร์กิวเมนต์ปลอมเนื่องจาก (เมื่อใช้กับ GCC หรือกระบวนการรวบรวมอื่น ๆ ที่มีสิทธิ์) libstdc ++ ไม่ได้กำหนดข้อ จำกัด ใด ๆ เกี่ยวกับโค้ดที่ใช้ไม่ว่าจะเชื่อมโยงแบบไดนามิกหรือแบบคงที่ ไม่ใช่ LGPL กรุณาอย่าแพร่กระจาย FUD gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.license.what
Jonathan Wakely

30

ลีนุกซ์รุ่นใหญ่ไม่ได้ให้ LLVM libc ++ เนื่องจาก:

  1. ซึ่งแตกต่างจาก Apple และ FreeBSD GPL + 3 ไม่ใช่ปัญหาดังนั้นจึงไม่จำเป็นต้องใช้สแต็กอื่นที่นี่
  2. คอมโพเนนต์ Linux ได้รับการพัฒนารอบ ๆ GNU libstd ++ มาเป็นเวลานาน บางส่วนไม่ได้ต่อยอดจากสิ่งอื่นใด
  3. แม้ว่า libc ++ จะมีคุณสมบัติใหม่ที่แข็งแกร่ง แต่ก็มีปัญหาบางอย่างกับรหัสเดิม

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

เช่นเดียวกับที่โจนาธานกล่าวคุณควรใช้เครื่องมืออะไรก็ได้ที่รวมอยู่ในค่าเริ่มต้น Clang ปลอดภัยใน Linux ที่จะใช้เนื่องจากได้รับการกำหนดค่าให้เป็น GCC แทนที่ดังนั้นในแง่มุมนั้นคุณไม่ต้องกังวลกับ 2 คอมไพเลอร์ นอกจากนี้เนื่องจากคุณกำหนดเป้าหมายสองแพลตฟอร์มคุณควรพิจารณา cmake


2
เสียงดังไม่ใช่การแทนที่ GCC ... เป็นเพียงคอมไพเลอร์อื่น
Isaac Pascual

4
@IsaacPascual สิ่งที่ Mario หมายถึงคือ clang มีเป้าหมายอย่างเป็นทางการในการออกแบบเพื่อทดแทนคอมไพเลอร์ที่โดดเด่นบนแพลตฟอร์มที่คุณเรียกใช้ (เช่น gcc เมื่อรันบน linux) เช่นเดียวกับคอมไพเลอร์ของ intel afaik เป็นวิธีที่จะนำไปใช้ในวงกว้าง
Johan Boulé
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.