ฉันใช้รหัสใน C / C ++ และใช้ Makefile (GNU) เพื่อรวบรวมรหัส ฉันสามารถทำเช่นเดียวกันกับ CMake และรับ MakeFile อย่างไรก็ตามความแตกต่างระหว่างการใช้ Makefile และ CMake เพื่อรวบรวมรหัสคืออะไร?
ฉันใช้รหัสใน C / C ++ และใช้ Makefile (GNU) เพื่อรวบรวมรหัส ฉันสามารถทำเช่นเดียวกันกับ CMake และรับ MakeFile อย่างไรก็ตามความแตกต่างระหว่างการใช้ Makefile และ CMake เพื่อรวบรวมรหัสคืออะไร?
คำตอบ:
Make (หรือค่อนข้าง Makefile) เป็น buildsystem - มันเป็นตัวขับเคลื่อนคอมไพเลอร์และเครื่องมือสร้างอื่น ๆ เพื่อสร้างรหัสของคุณ
CMake เป็นตัวกำเนิดของ buildsystems มันสามารถผลิต Makefiles, มันสามารถสร้างนินจาสร้างไฟล์, มันสามารถผลิตโครงการ KDEvelop หรือ Xcode, มันสามารถผลิตโซลูชั่น Visual Studio จากจุดเริ่มต้นเดียวกันไฟล์ CMakeLists.txt เดียวกัน ดังนั้นถ้าคุณมีโปรเจ็กต์ที่ไม่ขึ้นกับแพลตฟอร์ม CMake เป็นวิธีที่จะทำให้บิวด์เป็นอิสระจากระบบเช่นกัน
หากคุณมีนักพัฒนา Windows ที่คุ้นเคยกับนักพัฒนา Visual Studio และ Unix ที่สาบานด้วย GNU Make CMake คือหนึ่งในวิธีที่จะไป
ฉันมักจะแนะนำให้ใช้ CMake (หรือตัวสร้าง buildsystem อื่น แต่ CMake เป็นความชอบส่วนตัวของฉัน) หากคุณต้องการให้โครงการของคุณเป็นแบบหลายแพลตฟอร์มหรือใช้งานได้อย่างกว้างขวาง CMake เองยังมีคุณสมบัติที่ดีเช่นการตรวจจับการพึ่งพาการจัดการส่วนต่อประสานห้องสมุดหรือการรวมเข้ากับ CTest, CDash และ CPack
การใช้ตัวสร้างระบบสร้างทำให้โครงการของคุณพิสูจน์ได้ในอนาคต แม้ว่าคุณจะเป็น GNU-Make-only ในตอนนี้ถ้าคุณตัดสินใจที่จะขยายไปยังแพลตฟอร์มอื่น ๆ ในภายหลัง (ไม่ว่าจะเป็น Windows หรือบางอย่างที่ฝังอยู่) หรือเพียงแค่ต้องการใช้ IDE
find_package()
) หรือการสนับสนุนการทดสอบ / บรรจุภัณฑ์
คำสั่งเกี่ยวกับ CMake การเป็น "สร้างเครื่องกำเนิด" เป็นความเข้าใจผิดที่พบบ่อย
มันไม่ผิดทางเทคนิค มันแค่อธิบายว่ามันทำงานอย่างไร แต่ไม่ใช่สิ่งที่มันทำ
ในบริบทของคำถามพวกเขาทำสิ่งเดียวกัน: นำไฟล์ C / C ++ มารวมกันและแปลงให้เป็นไบนารี
ดังนั้นความแตกต่างที่แท้จริงคืออะไร?
CMake เป็นระดับสูงมากขึ้น มันเหมาะกับการคอมไพล์ C ++ ซึ่งคุณเขียนโค้ดบิลด์น้อยกว่ามาก แต่สามารถใช้สำหรับบิลด์เอนกประสงค์ได้เช่นกัน make
มีกฎ C / C ++ ในตัวเช่นกัน แต่ส่วนใหญ่จะไร้ประโยชน์
CMake
ทำบิลด์สองขั้นตอน: มันสร้างสคริปต์บิลด์ในระดับต่ำในninja
หรือmake
หรือเครื่องกำเนิดอื่น ๆ แล้วคุณก็รันมัน เชลล์สคริปทั้งหมดที่เรียงกันตามปกติMakefile
จะถูกเรียกใช้งานในระยะการสร้างเท่านั้น ดังนั้นการCMake
สร้างสามารถเป็นคำสั่งของขนาดได้เร็วขึ้น
ไวยากรณ์ของCMake
ง่ายมากที่จะได้รับการสนับสนุนเครื่องมือภายนอกกว่ายี่ห้อของ
เมื่อmake
สร้างสิ่งประดิษฐ์มันจะลืมวิธีการสร้าง แหล่งข้อมูลใดที่ถูกสร้างขึ้นจากคอมไพเลอร์ธงอะไร CMake
ติดตามมันmake
ทิ้งมันไว้กับคุณ หากหนึ่งในแหล่งที่มาของห้องสมุดจะถูกลบออกตั้งแต่รุ่นก่อนหน้าของMakefile
, make
จะไม่สร้างมัน
โมเดิร์นCMake
(เริ่มต้นด้วยรุ่น 3. บางอย่าง) ทำงานในแง่ของการพึ่งพาระหว่าง "เป้าหมาย" เป้าหมายยังคงเป็นไฟล์ otput ไฟล์เดียว (น่าเศร้า) แต่สามารถมีการถ่ายทอด ("สาธารณะ" / "ส่วนต่อประสาน" ในเงื่อนไข CMake) สกรรมกริยาอ้างอิงเหล่านี้สามารถสัมผัสหรือซ่อนตัวจากแพ็คเกจพึ่งพา CMake
จะจัดการไดเรกทอรีให้คุณด้วย ด้วยmake
คุณติดอยู่ในระดับไฟล์ต่อไฟล์และจัดการไดเรกทอรีโดยมือ
คุณสามารถเขียนโค้ดบางอย่างในการmake
ใช้ไฟล์ตั้งค่าสถานะเพื่อให้ครอบคลุมช่องว่างสองช่องที่ผ่านมา make
มีภาษาที่สมบูรณ์ของทัวริง (แม้แต่สองครั้งบางครั้งก็นับสามคนโกง ) และพวกเขาทั้งหมดน่ากลัว
จะซื่อสัตย์นี้เป็นสิ่งที่CMake
และmake
มีเหมือนกัน - ภาษาของพวกเขาจะน่ากลัวสวย:
จะเริ่มต้นด้วย.
แต่ในCMake
คุณเขียนโค้ดน้อยกว่ามาก