เวิร์กสเตชันออนไลน์ของ OnWorks Linux และ Windows

โลโก้

ฟรีโฮสติ้งออนไลน์สำหรับเวิร์กสเตชัน

<ก่อนหน้านี้ | Contents | ถัดไป>

การสร้างโปรแกรม

โปรแกรมส่วนใหญ่สร้างด้วยลำดับคำสั่งสองคำสั่งที่เรียบง่าย:



./ตั้งค่าคอนฟิก

./ตั้งค่าคอนฟิก


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



[me@linuxbox พจนานุกรม-1.11]$ . / กำหนดค่า

[me@linuxbox พจนานุกรม-1.11]$ . / กำหนดค่า


กำหนดค่าจะส่งข้อความจำนวนมากในขณะที่ทดสอบและกำหนดค่าบิลด์ เมื่อเสร็จแล้วจะมีลักษณะดังนี้:



กำลังตรวจสอบสถานะ libintl.h... ใช่ กำลังตรวจสอบ libintl.h... ใช่

กำลังตรวจสอบไลบรารีที่มี gettext... ไม่ต้องการการกำหนดค่า: การสร้าง ./config.status

config.status: การสร้าง Makefile config.status: การสร้าง diction.1 config.status: การสร้าง diction.texi config.status: การสร้าง diction.spec config.status: การสร้าง style.1 config.status: การสร้างการทดสอบ/rundiction config.status: กำลังสร้าง config.h [me@linuxbox diction-1.11]$

กำลังตรวจสอบสถานะ libintl.h... ใช่ กำลังตรวจสอบ libintl.h... ใช่

กำลังตรวจสอบไลบรารีที่มี gettext... ไม่ต้องการการกำหนดค่า: การสร้าง ./config.status

config.status: การสร้าง Makefile config.status: การสร้าง diction.1 config.status: การสร้าง diction.texi config.status: การสร้าง diction.spec config.status: การสร้าง style.1 config.status: การสร้างการทดสอบ/rundiction config.status: กำลังสร้าง config.h [me@linuxbox diction-1.11]$


สิ่งสำคัญที่นี่คือไม่มีข้อความแสดงข้อผิดพลาด หากมี การกำหนดค่าล้มเหลว และโปรแกรมจะไม่สร้างจนกว่าจะแก้ไขข้อผิดพลาด

เราเห็น กำหนดค่า สร้างไฟล์ใหม่หลายไฟล์ในไดเรกทอรีต้นทางของเรา สิ่งสำคัญที่สุดคือ Makefile. Makefile เป็นไฟล์การกำหนดค่าที่สั่งให้ ทำ โปรแกรมวิธีการสร้างโปรแกรมอย่างแน่นอน ปราศจากมัน, ทำ จะไม่ยอมวิ่ง Makefile เป็นไฟล์ข้อความธรรมดา ดังนั้นเราจึงสามารถดูได้:



[me@linuxbox พจนานุกรม-1.11]$ Makefile น้อย

[me@linuxbox พจนานุกรม-1.11]$ Makefile น้อย


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

ส่วนแรกของ makefile กำหนดตัวแปรที่ถูกแทนที่ในส่วนหลังของ makefile ตัวอย่างเช่นเราเห็นบรรทัด:



ซีซี = gcc

ซีซี = gcc


ซึ่งกำหนดให้คอมไพเลอร์ C เป็น gcc. ต่อมาใน makefile เราจะเห็นตัวอย่างหนึ่งที่มีการใช้งาน:


พจน์:

diction.o ประโยค.o misc.o getopt.o getopt1.o

$(CC) -o $@ $(LDFLAGS) diction.o ประโยค.o เบ็ดเตล็ด \ getopt.o getopt1.o $(LIBS)

พจน์:


ภาพ

ทำการแทนที่ที่นี่ และค่า $(ซีซี) ถูกแทนที่ด้วย gcc ในเวลาทำงาน

ภาพ

makefile ส่วนใหญ่ประกอบด้วยบรรทัดซึ่งกำหนด a เป้าในกรณีนี้ไฟล์เรียกทำงาน พจนานุกรมและไฟล์ที่ขึ้นอยู่กับ บรรทัดที่เหลืออธิบายคำสั่งที่จำเป็นในการสร้างเป้าหมายจากส่วนประกอบ เราเห็นในตัวอย่างนี้ว่าไฟล์ปฏิบัติการ พจนานุกรม (หนึ่งในผลิตภัณฑ์ขั้นสุดท้าย) ขึ้นอยู่กับการมีอยู่ของ พจนานุกรม.o, ประโยค.o, อื่นๆ, getopt.oและ getopt1.o. ต่อมาใน makefile เราจะเห็นคำจำกัดความของแต่ละสิ่งเหล่านี้เป็นเป้าหมาย:


พจนานุกรม.o:

getopt.o: getopt1.o: เบ็ดเตล็ด o:

diction.c config.h getopt.h misc.h ประโยค.h

getopt.c getopt.h getopt_int.h getopt1.c getopt.h getopt_int.h misc.c config.h เบ็ดเตล็ด

พจนานุกรม.o:

getopt.o: getopt1.o: เบ็ดเตล็ด o:


ประโยค o:

สไตล์.o:

ประโยค.c config.h mis.h ประโยค.h

style.c config.h getopt.h misc.h ประโยค.h

ประโยค o:

สไตล์.o:


ภาพ

อย่างไรก็ตาม เราไม่เห็นคำสั่งใด ๆ ที่ระบุสำหรับพวกเขา สิ่งนี้ถูกจัดการโดยเป้าหมายทั่วไป ก่อนหน้านี้ในไฟล์ ที่อธิบายคำสั่งที่ใช้ในการคอมไพล์ any .c ไฟล์ลงใน a .o ไฟล์:



.co:

$(CC) -c $(CPPFLAGS) $(CFLAGS) $

.co:

$(CC) -c $(CPPFLAGS) $(CFLAGS) $


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


[me@linuxbox พจนานุกรม-1.11]$ ทำ

[me@linuxbox พจนานุกรม-1.11]$ ทำ


การขอ ทำ โปรแกรมจะทำงานโดยใช้เนื้อหาของ Makefile เพื่อเป็นแนวทางในการดำเนินการ มันจะผลิตข้อความจำนวนมาก

เมื่อเสร็จสิ้น เราจะเห็นว่าเป้าหมายทั้งหมดอยู่ในไดเรกทอรีของเราแล้ว:



[me@linuxbox

พจน์-1.11]$ ls

config.เดา

เดโป

en

ติดตั้ง-sh

ประโยค.c

config.h

พจนานุกรม

en_GB

Makefile

ประโยค.h

config.h.in

พจน์.1

th_GB.mo

Makefile.in

ประโยค.o

config.log

พจนานุกรม.1.ใน

th_GB.po

เบ็ดเตล็ด

สไตล์

config.สถานะ

พจนานุกรมค

getopt1.c

เบ็ดเตล็ด

สไตล์.1

config.sub

พจนานุกรม.o

getopt1.o

อื่นๆ

สไตล์.1.ใน

กำหนดค่า

พจนานุกรมหม้อ

getopt.ซี

ข่าว

สไตล์.ค

config.in

พจนานุกรมข้อมูลจำเพาะ

getopt.h

nl

สไตล์.โอ

การทำสำเนา

พจน์.spec.in

getopt_int.h

nl.mo

ทดสอบ

de

พจนานุกรม. texi

getopt.o

nl.po

การสาธิต

พจนานุกรม.texi.in

ติดตั้ง

README


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

แต่ด้วยความอยากรู้ มาวิ่งกันเถอะ ทำ อีกครั้ง:


[me@linuxbox พจนานุกรม-1.11]$ ทำ

ทำให้: ไม่มีอะไรจะทำเพื่อ 'ทั้งหมด'

[me@linuxbox พจนานุกรม-1.11]$ ทำ

ทำให้: ไม่มีอะไรจะทำเพื่อ 'ทั้งหมด'


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



[me@linuxbox พจนานุกรม-1.11]$ RM getopt.o

[me@linuxbox พจนานุกรม-1.11]$ ทำ

[me@linuxbox พจนานุกรม-1.11]$ RM getopt.o

[me@linuxbox พจนานุกรม-1.11]$ ทำ


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



[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c

-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:14 พจนานุกรม

-rw-r--r-- 1 ฉัน ฉัน 33125 2007-03-30 17:45 getopt.c [me@linuxbox diction-1.11]$ แตะ getopt.c

[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c

-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:14 พจนานุกรม

-rw-r--r-- 1 ฉัน ฉัน 33125 2009-03-05 06:23 getopt.c [me@linuxbox diction-1.11]$ ทำ

[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c

-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:14 พจนานุกรม

-rw-r--r-- 1 ฉัน ฉัน 33125 2007-03-30 17:45 getopt.c [me@linuxbox diction-1.11]$ แตะ getopt.c

[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c

-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:14 พจนานุกรม

-rw-r--r-- 1 ฉัน ฉัน 33125 2009-03-05 06:23 getopt.c [me@linuxbox diction-1.11]$ ทำ


หลังจาก ทำ ทำงาน เราเห็นว่าได้คืนค่าเป้าหมายให้ใหม่กว่าการพึ่งพา:



[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c

-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:24 พจนานุกรม

-rw-r--r-- 1 ฉัน ฉัน 33125 2009-03-05 06:23 getopt.c

[me@linuxbox พจนานุกรม-1.11]$ ls -l พจน์ getopt.c

-rwxr-xr-x 1 ฉัน ฉัน 37164 2009-03-05 06:24 พจนานุกรม

-rw-r--r-- 1 ฉัน ฉัน 33125 2009-03-05 06:23 getopt.c


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


มีความสำคัญมากกับโครงการขนาดใหญ่ โปรดจำไว้ว่า เคอร์เนลของลินุกซ์ (โปรแกรมที่อยู่ภายใต้การดัดแปลงและปรับปรุงอย่างต่อเนื่อง) ประกอบด้วย ล้าน บรรทัดของรหัส


ระบบปฏิบัติการคลาวด์คอมพิวติ้งยอดนิยมที่ OnWorks: