การใช้คอมไพเลอร์ C ++ ที่แตกต่างกันและเวอร์ชันภาษาเมื่อพัฒนาไฟล์ปฏิบัติการเดี่ยว


15

บริษัท ของเราจะซื้อซอร์สโค้ดขนาดใหญ่และซับซ้อนมากสำหรับการสื่อสารผ่านดาวเทียม

มันถูกเข้ารหัสใน C ++ และเราจะใส่รหัสเพิ่มเติมเข้าไปใน C ++ เชื่อมโยงรหัสของเรากับรหัสที่ซื้อไปยังหน่วยที่ปฏิบัติการได้เพียงหน่วยเดียว

  • จำเป็นหรือไม่ที่เราจะใช้คอมไพเลอร์รุ่นเดียวกันและคอมไพเลอร์รุ่นเดียวกันกับที่ใช้ในการพัฒนารหัสที่ซื้อมา?

  • จำเป็นหรือไม่ที่เราจะต้องใช้ C ++ รุ่นเดียวกันกับรหัสที่ซื้อมา? หากไม่ได้ใช้ 2014 เรา_might_ต้องการใช้คุณลักษณะบางอย่างของมัน แต่ไม่ใช่หากมีปัญหาในการผสมเวอร์ชันที่แตกต่างกัน

แน่นอนว่าในทางทฤษฎีมันไม่ควรมีความสำคัญโดยเฉพาะอย่างยิ่งรุ่นภาษา แต่เป็นไปได้ว่าคอมไพเลอร์รุ่นต่าง ๆ จะสร้างรหัสวัตถุที่แตกต่างกันซึ่งอาจนำไปสู่ความแตกต่างของเวลาเป็นต้น

เราควรระวังอะไรบ้าง?


7
ฉันหวังว่าคุณจะไม่เพียง แต่จะซื้อซอร์สโค้ด แต่การสนับสนุนบางอย่าง (โดยบุคคลที่มีคุณสมบัติ) บนมัน
Basile Starynkevitch

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

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

3
แม้แต่เวอร์ชั่นภาษาอาจมีความสำคัญให้ดูที่gcc.gnu.org/wiki/Cxx11AbiCompatibilityสำหรับรายการคอมไพเลอร์ (เก่า) และความแตกต่างเล็กน้อยใน ABI กล่าวอีกนัยหนึ่ง: คอมไพเลอร์เดียวกัน แต่การตั้งค่าภาษา c ++ ที่แตกต่างกัน (c ++ 03 s c ++ 11) อาจมีความสำคัญ
André

2
และด้วย MSVC โดยทั่วไปจะไม่ปลอดภัยที่จะส่งผ่านวัตถุไลบรารีมาตรฐานข้ามขอบเขตไลบรารี (แบบไดนามิก) ดูตัวอย่างstackoverflow.com/q/5661738/417197
André

คำตอบ:


9

จำเป็นหรือไม่ที่เราจะใช้คอมไพเลอร์รุ่นเดียวกันและคอมไพเลอร์รุ่นเดียวกันกับที่ใช้ในการพัฒนารหัสที่ซื้อมา?

มันขึ้นอยู่กับ.

คอมไพเลอร์สร้างรหัสเป้าหมาย ABI บางคนใช้ ABI ทั่วไป (ตัวอย่างเช่นถ้าฉันไม่เข้าใจผิดทั้ง clang ++ และ g ++ เป้าหมายที่เรียกว่า Itanium ABI) และคุณควร - อาจมีข้อบกพร่องที่ทำให้คุณไม่สามารถใช้รหัสวัตถุได้ จากทั้งสองในโปรแกรมเดียวกัน (สมมติว่าคุณกำลังใช้เวอร์ชันที่มีเป้าหมายเป็นเวอร์ชันเดียวกันของ ABI) สิ่งเดียวกันนี้เป็นจริงระหว่างเวอร์ชันคอมไพเลอร์: บางคนให้ความสำคัญกับ ABI เดียวกันมากกว่าเวอร์ชันอื่น ๆ เห็นได้ชัดว่าพวกเขาทุกคนต้องการการเปลี่ยนแปลง ABI บางครั้งและพวกเขาอาจถูกบังคับให้ทำในลักษณะที่ไม่เข้ากัน และแน่นอนว่าการตั้งค่าบางอย่างเช่นการเลือกมาตรฐานภาษาอาจมีผลต่อการเลือก ABI

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

กล่าวอีกนัยหนึ่งคุณต้องขุดและค้นหาข้อมูลสำหรับกรณีเฉพาะที่คุณเป็นจุดเริ่มต้นและตัวอย่างของชนิดของข้อมูลที่คุณควรค้นหานี่คือข้อมูลที่ให้โดย libstdc ++ (ห้องสมุดที่ใช้โดย g ++ และในการกำหนดค่าโดย clang ++)


10
ABI = Application Binary Interface
Simon B

2
คำตอบนี้เกี่ยวกับความเข้ากันได้ของรหัสวัตถุ OP คือซื้อรหัสที่มา
การแข่งขัน Lightness กับโมนิก้า

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

1
@ jpmc26: "นี่เป็นสิ่งที่ฉันเข้าใจว่า OP จะต้องถามถ้าคุณอ่านมันแตกต่างกันคุณอาจต้องขอ OP เพื่อชี้แจง" OP ระบุอย่างชัดเจนว่า บริษัท ของพวกเขา "จะซื้อซอร์สโค้ดที่ซับซ้อนและมีขนาดใหญ่มาก" นอกจากนี้ด้วยข้อความเช่น "เป็นไปได้ว่าคอมไพเลอร์รุ่นต่าง ๆ จะสร้างรหัสวัตถุที่แตกต่างกันซึ่งอาจนำไปสู่ความแตกต่างของเวลา" พวกเขาจะถามว่าการเปลี่ยนแปลงเมื่อรวบรวมรหัสที่ซื้อมาด้วยเครื่องมือที่แตกต่างกัน ฉันไม่คิดว่าจะมีการตีความมากพอ!
การแข่งขัน Lightness กับโมนิก้า

8

จำเป็นหรือไม่ที่เราจะใช้คอมไพเลอร์รุ่นเดียวกันและคอมไพเลอร์รุ่นเดียวกันกับที่ใช้ในการพัฒนารหัสที่ซื้อมา? จำเป็นหรือไม่ที่เราจะใช้ C ++ รุ่นเดียวกันกับรหัสที่ซื้อมา?

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

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


นี่เป็นคำแนะนำที่ดีทีเดียว!
T. Sar - Reinstate Monica

เป็นจริง แต่อนิจจาสายเกินไป เมื่อฉันพูดถึงความคิดเห็นของ Basile ฉันได้ถามคำถามของผู้จัดหาสินค้าด้วย แต่ฉันคิดว่ามันจะเป็นจุดอภิปรายที่ดีที่นี่และเป็นข้อมูลอ้างอิงที่ดีสำหรับผู้อื่นในอนาคต
Mawg กล่าวว่าการคืนสถานะโมนิก้า

4

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

ฟังดูเข้าท่า!

จำเป็นหรือไม่ที่เราจะใช้คอมไพเลอร์รุ่นเดียวกันและคอมไพเลอร์รุ่นเดียวกันกับที่ใช้ในการพัฒนารหัสที่ซื้อมา?

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

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

ในที่สุดคุณจะต้องถามผู้แต่ง / ผู้ขายว่าซอร์สโค้ดเขียนไว้สำหรับอะไร หากพวกเขาอ้างว่าเขียนขึ้นโดยเฉพาะเจาะจงเช่นพูดว่า Visual Studio 2015 และต้องการคุณสมบัติ Windows API คุณก็ควรจะทำเช่นนั้น แต่ถ้าพวกเขาอ้างว่ามันเป็นอุปกรณ์พกพามาตรฐาน C ++ ให้ใช้คอมไพเลอร์ที่คุณชอบ ตรวจสอบให้แน่ใจว่าข้อตกลงการซื้อของคุณมีข้อตกลงการสนับสนุนเพื่อให้คุณสามารถรับความช่วยเหลือได้ฟรีเมื่อผู้ขายโกหก

จำเป็นหรือไม่ที่เราจะต้องใช้ C ++ รุ่นเดียวกันกับรหัสที่ซื้อมา? หากไม่ได้ใช้ 2014 เราอาจต้องการใช้คุณสมบัติบางอย่างของมัน แต่ไม่ใช่หากมีปัญหากับการผสมเวอร์ชันที่แตกต่างกัน

อาจ. อาจจะ.

C ++ 03 รองรับการส่งต่อส่วนใหญ่ดังนั้นหากรหัสคือ C ++ 03 แสดงว่าคุณไม่มีปัญหา (แม้ว่าอาจต้องปรับแต่งบางอย่าง)

แต่ฟีเจอร์ที่แนะนำใน C ++ 11 และ C ++ 14 นั้นไม่เข้ากันได้แบบย้อนหลังดังนั้นหากผู้ขายใช้พูด lambdas C ++ 11 และคุณพยายามสร้างรหัสของพวกเขาในคอมไพเลอร์ C ++ 03 ที่เพิ่งชนะ ไม่ทำงาน

แน่นอนว่าในทางทฤษฎีมันไม่ควรมีความสำคัญโดยเฉพาะอย่างยิ่งรุ่นภาษา แต่เป็นไปได้ว่าคอมไพเลอร์รุ่นต่าง ๆ จะสร้างรหัสวัตถุที่แตกต่างกันซึ่งอาจนำไปสู่ความแตกต่างของเวลาเป็นต้น

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

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


เร็ว ๆ นี้: การเชื่อมโยงไม่ครอบคลุมในข้อกำหนด C ++ ในขณะที่รหัสอาจคอมไพล์ในคอมไพเลอร์ที่สอดคล้องกันหลายตัว แต่ก็ไม่รับประกันว่าคุณจะสามารถเชื่อมโยงมันเข้าด้วยกันและทำงานได้
Cort Ammon - Reinstate Monica

1
@CortAmmon: คุณควร / ต้องรวบรวมส่วนประกอบทั้งหมดของการกระจายผลลัพธ์ด้วย toolchains ที่ใช้ ABI ร่วมกัน มาตรฐาน ABI อยู่นอกขอบเขตของ C ++ ฉันไม่คิดว่า OP จะถามเกี่ยวกับการผสมเครื่องมือหรือไม่
การแข่งขัน Lightness กับโมนิก้า

2

คุณไม่ได้เชื่อมโยงรหัสคุณเชื่อมโยงไฟล์วัตถุที่คอมไพล์แล้ว

ในกรณีนี้ใช่การใช้คอมไพเลอร์ C ++ ที่แตกต่างกัน (หรือการตั้งค่าเช่น debug / release builds) หรือเวอร์ชันต่าง ๆ หรือไลบรารีมาตรฐานอื่น (รุ่น) เมื่อสร้างชิ้นส่วนที่จะโต้ตอบในระดับไบนารีมีแนวโน้มสูงที่จะทำลาย แอปพลิเคชันหากชิ้นส่วนสื่อสารกันโดยใช้มากกว่า C APIs

คุณลักษณะเช่นคอนเทนเนอร์หรือข้อยกเว้นมีอินเทอร์เฟซเดียวกัน แต่ในระดับไบนารี่สามารถนำไปใช้ได้หลายวิธีที่ไม่เข้ากัน

อย่างไรก็ตามการใช้คอมไพเลอร์ที่แตกต่างกันในการรวบรวมรหัสทั้งหมดเป็นปัญหาที่แตกต่างกัน คำถามที่ต้องพิจารณา:

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

นอกจากนี้ยังมีความเสี่ยงที่รหัสอาจมีชิ้นส่วนที่ทำให้เกิดพฤติกรรมที่ไม่ได้กำหนด สิ่งเหล่านี้อาจทำงานได้ดีเมื่อใช้คอมไพเลอร์ตัวเดียว แต่ล้มเหลวในวิธีลึกลับเมื่อใช้ตัวอื่น


OP กำลังสร้างรหัสไม่ใช่ผู้ขาย OP จะถามว่าการเปลี่ยนแปลงสภาพแวดล้อมการสร้าง (ผู้ขาย) อาจส่งผลกระทบต่อการสร้างรหัสที่ได้รับรหัสฐานเดียวกัน
การแข่งขัน Lightness กับโมนิก้า

1

จำเป็นหรือไม่ที่เราจะใช้คอมไพเลอร์รุ่นเดียวกันและคอมไพเลอร์รุ่นเดียวกันกับที่ใช้ในการพัฒนารหัสที่ซื้อมา?

การสลับคอมไพเลอร์สามารถนำไปสู่ปัญหาบางอย่าง ขณะนี้ใน บริษัท ของฉันเราใช้ Clang และ MSVC และเรามีข้อผิดพลาดในคอมไพเลอร์หนึ่งที่อีกอันไม่ได้ทำเครื่องหมาย

จำเป็นหรือไม่ที่เราจะต้องใช้ C ++ รุ่นเดียวกันกับรหัสที่ซื้อมา? หากไม่ได้ใช้ 2014 เราอาจต้องการใช้คุณสมบัติบางอย่างของมัน แต่ไม่ใช่หากมีปัญหากับการผสมเวอร์ชันที่แตกต่างกัน

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


ค่อนข้างคิดของฉัน สิ่งที่เกี่ยวกับคอมไพเลอร์ verions - ถ้าพวกเขาใช้ GCC เวอร์ชัน x และล่าสุดคือ x + 2 เช่น
Mawg กล่าวว่าคืนสถานะโมนิก้า

1
ถ้าพวกเขาใช้คอมไพเลอร์เวอร์ชั่นเก่ากว่าที่คุณต้องการใช้มันก็ไม่มีปัญหาเพราะไม่มีสิ่งต่าง ๆ เช่นสิ่งที่เลิกใช้แล้วปัญหาอาจเพิ่มขึ้นหากพวกเขาใช้คอมไพเลอร์เวอร์ชั่นใหม่ของคุณ
LaboPie

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

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

1
ภาคผนวกเล็ก ๆ น้อย ๆ ของหลักสูตรปัญหามากขึ้นถ้าคอมไพเลอร์ที่ใช้จากสำนักงานอื่นไม่ได้เป็นคนสำคัญ EG เป็นคอมไพเลอร์คอนโซลรุ่นเก่าหรือบางอย่างที่ทำงานกับชุดย่อยของภาษา
LaboPie

1

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

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


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