การเรียน makefiles มีความสำคัญแค่ไหน? [ปิด]


12

ฉันทำงานใน c ++ ส่วนใหญ่เป็นงานอดิเรก (ฉันยังเรียนหนังสืออยู่และไม่มีงานจริง) IDEs สร้าง makefile ให้ฉันและฉันก็สงสัยว่ามันคุ้มค่าที่จะเรียนรู้วิธีทำให้มันเป็นตัวของตัวเองหรือเปล่า โดย "การเรียนรู้ที่คุ้มค่า" ฉันหมายถึงฉันควรวางทุกอย่างและเรียนรู้วิธีการเขียนก่อนที่จะเรียนรู้ c ++ ต่อไปหรือไม่ การเรียนรู้พวกเขาจะจำเป็นจริงๆหรือ? ถ้าเป็นเช่นนั้นฉันควรเรียนรู้เกี่ยวกับพวกเขา (ไวยากรณ์ทั่วไปและความเข้าใจวิธีการทำงาน ฯลฯ ) หรือเรียนรู้วิธีการเขียนพวกเขาจริง ๆ ?


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

ถ้าคุณต้องการให้ผู้อื่นคอมไพล์ซอร์สของคุณบน Linux และระบบปฏิบัติการบน Unix อื่น ๆ คุณต้องเรียนรู้

คุณสามารถเรียนรู้พื้นฐานของ makefiles อ้างอิงและแทน ฯลฯ ในเวลาน้อยกว่าที่มันจะนำคุณไปอ่านคำตอบทุกคำถามนี้ :)
JohnB

คำตอบ:


14

ใช่มันคุ้มค่าที่จะเข้าใจว่า Makefiles ทำงานอย่างไร อาจไม่เกี่ยวข้องกับคุณในขณะนี้ (เนื่องจากคุณใช้ IDE ที่สร้างขึ้นมา) แต่โอกาสที่ความรู้จะเป็นประโยชน์ในอนาคต

โดย "การเรียนรู้ที่คุ้มค่า" ฉันหมายถึงฉันควรวางทุกอย่างและเรียนรู้วิธีการเขียนก่อนที่จะเรียนรู้ c ++ ต่อไปหรือไม่

นั่นคือแนวคิดที่แปลกประหลาดของ "การเรียนรู้ที่คุ้มค่า" ...

แต่ไม่ฉันไม่คิดว่าคุณต้องทำอย่างนั้น

การเรียนรู้พวกเขาจะจำเป็นจริงๆหรือ?

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

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

ฉันขอแนะนำให้ทั้งสอง หากคุณไม่สามารถเขียน Makefile ได้มันก็เป็นที่ถกเถียงกันอยู่ว่าคุณรู้ว่าเกิดอะไรขึ้น

มีมุมมองอื่นที่บอกว่าความรู้มากเกินไปไม่เป็นประโยชน์

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


สุดท้ายคุณติดแท็กคำถามด้วย "java" สิ่งที่ฉันต้องทำคือคุณไม่ควรใช้makeเพื่อสร้างแอปพลิเคชัน Java (เว้นแต่ว่าคุณกำลังสร้างไลบรารี่โค้ดดั้งเดิมด้วย) มี Java เครื่องมือเฉพาะการสร้างที่มีมากง่ายต่อการใช้งาน ... makeและทำผลงานได้ดีกว่า


8

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


เรียนรู้ที่จะอ่านหรือเรียนรู้การเขียน?

ทั้งสอง คุณต้องการทราบวิธีการอ่านเพื่อให้คุณสามารถดีบักปัญหาของซอฟต์แวร์ที่คุณใช้หรือเขียนเพื่อให้คุณสามารถสร้างของคุณเอง
EhevuTov

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

3

Makefiles มีความสำคัญกับระบบ UNIX (เช่น AIX, Linux, OS X) อย่างไรก็ตามฉันคิดว่าความสำคัญของพวกเขา "คุณต้องรู้" สำคัญลดลงในช่วงไม่กี่ปีที่ผ่านมา ตัวอย่างเช่นคุณไม่พบพวกเขาจริงๆในการพัฒนา Windows (Visual Studio และอื่น ๆ ) และ XCode (บน OS X) ใช้ระบบที่แตกต่างออกไปโดยสิ้นเชิง ฉันไม่ค่อยเข้าสู่ Java แต่ฉันคิดว่าพวกเขาใช้ไฟล์ ant และอะไรก็ตาม

มีระบบที่ยอดเยี่ยมมากที่เรียกว่า CMake ซึ่งสร้างไฟล์การสร้างดั้งเดิมสำหรับระบบปฏิบัติการที่คุณใช้งาน ตัวอย่างเช่นถ้าคุณเขียนข้อกำหนดโครงการของคุณใน CMake คุณสามารถสร้างโครงการสร้าง Visual Studio บน Windows โครงการ XCode บน Mac และ Makefile บน Linux CMake แทนที่ autoconf และ automake

ฉันมักจะสร้างไฟล์ CMake สำหรับ "โครงการใหญ่" ของฉัน แต่ฉันรู้ว่า Make ในกรณีที่ฉันต้องการเขียนด่วน "เพียงแค่ทำมันเสร็จ" Makefile เป็นเรื่องที่ดีสำหรับความรู้ทางวัฒนธรรมของคุณเนื่องจากมีห้องสมุดซอฟต์แวร์จำนวนมากที่ใช้ Makefiles และคุณจะต้องแก้ไขคอมไพเลอร์และตำแหน่งห้องสมุดอย่างหลีกเลี่ยงไม่ได้ แต่คุณจะพบว่าโครงการขนาดใหญ่ (เช่น KDE) กำลังย้ายไปยัง CMake และสิ่งที่คล้ายกันเนื่องจาก Make มีข้อ จำกัด บางอย่างที่อยู่ด้านหลังหัวน่าเกลียดเมื่อโครงการมีความซับซ้อน


การเรียนรู้ CMake จะเป็นคำสั่งที่มีประโยชน์มากขึ้น Makefiles สามารถเห็นได้ในรายละเอียดของการติดตั้งใช้งาน - ไม่ต้องกังวลกับการเรียนรู้ (จนกว่าจะถูกบังคับอย่างแท้จริง) เช่นเดียวกับไฟล์โครงการ Visual Studio

2

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


สนใจอธิบายว่าทำไม makefiles จึงเป็นระบบที่แย่มาก เมื่อเทียบกับอะไร
JonnyJD

@ JonnyJD: สิ่งหนึ่งคือฉันไม่เชื่อว่าระบบ build ที่ดีควรให้คุณใส่ไฟล์ make ในแต่ละไดเรกทอรีย่อย แต่มันไม่ดีเพราะมันใช้งานไม่ง่ายนักแล้วเขียนไฟล์ bat ซึ่งพูดอะไรบางอย่างจริงๆ

ฟังดูเหมือนคุณจะไม่ชอบการสร้างไฟล์ด้วยมือ ซึ่งในตัวของมันเองนั้นไม่ใช่เรื่องใหญ่อะไร Makefiles เป็นตัวแปรที่ควรอ่านและเขียนด้วยตนเองได้ (ทำเป็นโมดูล, เพียงแค่อ้างอิงการติดตามการพึ่งพาเมื่อเปรียบเทียบกับ bash / bat) ชิ้นส่วนอัตโนมัติคือระบบอัตโนมัติ สิ่งเดียวที่แตกต่างกันมากคือการระบุการพึ่งพาใน GUI และบันทึกทั้งหมดนี้ไว้ในไฟล์โครงการเดียว หรือสิ่งที่สร้างระบบที่น่ากลัวน้อยกว่ามาก?
JonnyJD

2

เช่นเดียวกับหลาย ๆ ด้านของเอาต์พุต IDE makefile ที่สร้างโดยอัตโนมัติมักจะมีโครงสร้างที่ไม่มีประสิทธิภาพ

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

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


2

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


1

การเรียนรู้วิธีการเขียน Makefiles เป็นความคิดที่ดีด้วยเหตุผลหลายประการ

  1. Make เป็นภาษาที่ให้คุณเข้ารหัสการพึ่งพาระหว่างส่วนประกอบผ่านกฎต่างๆ คุณจะได้รับประสบการณ์มากมายในการเขียนโค้ดด้วยวิธีนี้และมันจะขยายเครื่องมือของคุณสำหรับการคิดเกี่ยวกับการแก้ปัญหาการเขียนโปรแกรม
  2. หลักการที่คุณเรียนรู้ด้วย Make สามารถใช้กับ Ant, Maven และ Rake หากคุณเลือกที่จะเรียนรู้การเขียนโปรแกรมใน Java หรือ Ruby world
  3. IDEs จำนวนมากมีไฟล์เวทย์มนตร์ที่มีข้อมูลการกำหนดค่าเพื่อช่วยคุณสร้างซอฟต์แวร์ หากคุณไม่เชื่อฉันลองเขียนสคริปต์เพื่อสร้างซอฟต์แวร์โดยไม่มี IDE เมื่อคุณเขียน Makefiles ของคุณเองคุณจะตระหนักถึงการพึ่งพาระหว่างโค้ดไลบรารีและตัวแปรสภาพแวดล้อมของคุณ เมื่อระบบมีขนาดใหญ่ขึ้นสิ่งนี้กลายเป็นเครื่องมือที่มีประโยชน์สำหรับการดีบักระบบของคุณ

0

คุณควรพยายามทำความเข้าใจระบบการสร้างที่คุณใช้อยู่เสมอ

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

ฉันมักจะคิดว่าการสร้าง (ง่าย) Makefiles เป็นขั้นตอนที่ง่ายที่สุดในการเข้าใจสิ่งที่เกิดขึ้น แต่คุณอาจมีวิธีอื่นในการทำความเข้าใจวิธีการสร้างสิ่งต่าง ๆ

ทำไม / เมื่อไรถึงต้องเรียน Makefiles

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

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

หากคุณต้องการโปรแกรมสำหรับแพลตฟอร์มที่แตกต่างกันแน่นอนคุณต้องใช้ระบบการสร้างที่แพร่หลาย

ยังไม่ได้หมายความว่าคุณต้องรู้ว่า Makefiles ที่สร้างอัตโนมัติทำงานโดยละเอียดอย่างไร คุณเพียงแค่ต้องรู้ว่าไฟล์อินพุตสำหรับระบบบิลด์ทำงานอย่างไร สิ่งเหล่านี้เกิดขึ้นเพื่อมีไวยากรณ์ที่คล้ายกันบางครั้ง


ส่วนตัวแล้วฉันชอบ Makefiles และใช้มันกับหลาย ๆ อย่าง ไม่ใช่แค่การรวบรวมรหัส ฉันสร้าง Makefile สำหรับทุก pdf ที่ใหญ่กว่าที่ฉันสร้าง (ด้วย LaTeX) และทุกโครงการที่ฉันต้องทำงานสองสามอย่างโดยอัตโนมัติใน (การสร้างการบรรจุการอัปโหลดการอัปเดตการพึ่งพาจากแหล่งเก็บข้อมูลต้นฉบับดึง / ดันสำเนาสำรองด้วยตนเอง)

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

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

หากคุณมีและใช้เครื่องมือ / GUIs / IDE สำหรับทุกสิ่งคุณอาจไม่ได้รับความรู้นั้นเลย

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