Makefile นี้ทำให้โปรแกรม C โดยไม่ต้องระบุคอมไพเลอร์ได้อย่างไร


41

ผมก็ใช้ Makefile จากหนังสือ " การเขียนโปรแกรมขั้นสูงลินุกซ์ (2001)" [code] มันแปลกสำหรับฉันที่เห็นว่าGNU make ทำการคอมไพล์โค้ดอย่างถูกต้องโดยไม่ต้องระบุคอมไพเลอร์ใน Makefile มันเหมือนการอบไม่มีสูตรใด ๆ !

นี่เป็นรหัสขั้นต่ำ:

test.c

int main(){}

Makefile

all:            test

และทำให้ได้ผลจริง ๆ ! นี่คือคำสั่งที่รัน:

cc     test.c   -o test

ฉันไม่พบสิ่งที่มีประโยชน์ในเอกสาร เป็นไปได้อย่างไร?


PS หมายเหตุเพิ่มเติมหนึ่ง: แม้ภาษาจะไม่ได้ระบุ; เพราะtest.cใช้ได้ GNU ใช้make ccหากมีอยู่test.cppหรือtest.cc(เมื่อไม่มีtest.c) ก็ใช้g++(และไม่c++)


4
"มันเหมือนการอบไม่มีสูตรใด ๆ !" สูตรจะบอกให้คุณต้มน้ำ แต่ไม่ใช่ว่าคุณควรต้มน้ำโดยใช้กระทะบนเตาแก๊สกระทะบนเตาแม่เหล็กไฟฟ้ากาต้มน้ำไฟฟ้าหรือหม้อที่วางบนขาตั้งไฟ มันจะไม่บอกคุณด้วยซ้ำว่าคุณควรจะรับน้ำจากที่ไหน นี้เป็นเหมือนการบอกmakeการต้มน้ำและการใช้กฎระเบียบภายในของมันmakeก็จะคิดออกว่า;)
Rhymoid

1
@Rymymoid มันเหมือนตะโกนออกมา: ฉันต้องการเค้ก! จากนั้นหุ่นยนต์ที่เรียกว่าmakeตรวจสอบตู้เย็นของคุณและพบว่ามีแป้งอยู่บ้างจากนั้นอบเค้กเริ่มต้นให้คุณจากสูตรภายใน :-)
Ho1

@ Ho1: หุ่นยนต์อาจถามเค้กไหนที่คุณอยากได้ครับ :): D
Thushi

คำตอบ:


68

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

จริงๆแล้วคุณไม่จำเป็นต้องใช้ Makefile:

make test

จะทำงานโดยไม่มีใคร

หากต้องการดูกฎที่ซ่อนอยู่ซึ่งทำให้เป็นไปได้ทั้งหมดให้ใช้-pตัวเลือกที่ไม่มี Makefile:

make -p -f /dev/null

ตามที่alephzeroชี้ให้เห็นว่า Make มีกฎในตัวมาเป็นเวลานาน (ถ้าไม่เสมอไป) รุ่นแรกของ Stuart Feldman ใน Unix V7 กำหนดไว้ในfiles.cและ1,979 กระดาษของเขากล่าวถึงพวกเขา พวกเขายังเป็นส่วนหนึ่งของข้อกำหนด POSIX (นี่ไม่ได้หมายความว่าการนำไปใช้งานทั้งหมดของ Make สนับสนุนพวกเขา - Borland Make for DOS ไม่ได้เป็นรุ่น 3.0 อย่างน้อย)


2
ฉันคิดอย่างนั้น แต่POSIX ก็ระบุเช่นกัน !
Stephen Kitt

5
@KingZoingo Make มีผลกับเอ็นจินการอนุมาน: มีชุดของกฎ (ในตัวและจาก Makefile) สิ่งประดิษฐ์ที่มีอยู่ (ไฟล์ในไดเรกทอรีปัจจุบันหรือชื่อใน Makefile) และสิ่งประดิษฐ์ที่ร้องขอ (เป้าหมายใน Makefile); มันเพียงแค่พยายามจับคู่กฎและสิ่งประดิษฐ์ที่มีอยู่เพื่อตรวจสอบว่าสามารถใช้เพื่อรับวัตถุที่ร้องขอได้หรือไม่ กฎในตัวบอกว่าtest.cสามารถใช้ผลิตtestได้ make -dจะแสดงรายละเอียดกระบวนการให้คุณ ...
Stephen Kitt

4
@ Ho1 @StephenKitt นี่เป็นmakeเวลานานก่อนที่ GNU หรือ POSIX จะถูกประดิษฐ์ขึ้นมา รุ่นแรกเขียนขึ้นเมื่อเกือบ 40 ปีที่แล้วและมีบางรุ่นต้นแบบที่สร้างขึ้นจากสคริปต์เชลล์แม้ก่อนหน้านั้น
alephzero

3
@jamesqf CPPยังคงเรียกใช้ preprocessor ( cc -Eโดยทั่วไป); c ++ CXXคอมไพเลอร์คือ
Stephen Kitt

3
@ Ho1 CXXในบริบทนี้คือตัวแปร Make ไม่ใช่คำสั่ง - $(CXX)ใน Makefile จะถูกแทนที่ด้วยคำสั่งเพื่อเรียกใช้คอมไพเลอร์ C ++
Stephen Kitt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.