ตัวอย่างเช่นเมื่อฉันป้อน:
gcc -O hello.c -c
หรือ
gcc hello.c -c -O
ทั้งสองไม่ได้บ่น
ลำดับของตัวเลือกคำสั่งมีความสำคัญหรือไม่?
ตัวอย่างเช่นเมื่อฉันป้อน:
gcc -O hello.c -c
หรือ
gcc hello.c -c -O
ทั้งสองไม่ได้บ่น
ลำดับของตัวเลือกคำสั่งมีความสำคัญหรือไม่?
คำตอบ:
ขึ้นอยู่กับตัวโปรแกรมเอง ระบบปฏิบัติการไม่ได้กำหนดว่าจะสั่งหรือไม่ก็ตาม
ชุดตัวเลือกของ GCC นั้นใหญ่โตจนฉันไม่สามารถพูดกับผู้มีอำนาจใด ๆ หากคุณสามารถจัดหาตัวเลือกใด ๆตามลำดับที่กำหนดเอง คุณจะต้องอ่านเอกสารประกอบสำหรับตัวเลือกนั้น ที่กล่าวว่ากฎทั่วไปง่ายๆก็คือถ้าคุณมีตัวเลือกที่ไม่เหมือน-O1 -O2
กันสองตัวเลือกขึ้นไป (เช่นสำหรับการเพิ่มประสิทธิภาพในระดับที่แตกต่างกัน) โดยทั่วไปโปรแกรมจะใช้ตัวเลือกในภายหลังมากกว่าตัวเลือกก่อนหน้า อีกครั้งนี่ไม่ได้บังคับใช้โดย linux
โปรแกรมง่ายๆที่จะช่วยให้คุณสามารถระบุตัวเลือกมากที่สุดในลำดับใด ๆ ls
จะเป็น รายชื่อไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันมีรายละเอียดที่สามารถทำได้ด้วยการอย่างใดอย่างหนึ่งls -la
, หรือls -al
ls -l -a
อย่างไรก็ตาม ls -l1 (นั่นคือ 'el' 'one') ไม่ได้ให้ผลลัพธ์เช่นเดียวกับ ls -1l ('one' 'l') เหล่านี้เป็นตัวเลือกที่ไม่เกิดร่วมกันและรายการสุดท้ายจะถูกกำหนดเป็นครั้งแรก
นอกจากนี้ยังมีโปรแกรมแปลก ๆ ที่ใช้ตัวเลือกในการโต้แย้งเมื่อพวกเขามาถึง ดังนั้นสำหรับตัวอย่างเช่นคุณอาจมีคำสั่งที่สมมุติblah -a 1 2 -b 3
ที่-a
นำไปใช้กับทั้งสามข้อโต้แย้ง แต่จะใช้กับ-b
3
อีกครั้งนี้ขึ้นอยู่กับแต่ละโปรแกรมที่เป็นปัญหา หากคุณไม่แน่ใจให้อ่านเอกสารประกอบ
มีหลายกรณีที่คำสั่งของตัวเลือกบรรทัดคำสั่งมีความสำคัญแม้ใน GCC หากคุณกำลังเชื่อมโยงกับสแตติกไลบรารี (.a) ดังนั้นหากคุณระบุ-llib1 -llib2
และมีฟังก์ชั่นในการliblib2.a
เรียกฟังก์ชั่นในliblib1.a
ที่ไม่ได้นำเข้าสู่โปรแกรมลิงค์นั้นจะล้มเหลวด้วยสัญลักษณ์ที่ไม่ได้รับการแก้ไข ด้วยไลบรารีที่แบ่งใช้นี่ไม่ใช่ปัญหา
โดยทั่วไปตามที่คนอื่นพูดลำดับของตัวเลือกอาจหรือไม่อาจสร้างความแตกต่าง อย่างไรก็ตามเอาต์พุตจากคำสั่งสองคำสั่งด้านล่างนั้นแตกต่างกันดังนั้นลำดับของอาร์กิวเมนต์ที่จะcat
เปลี่ยนแปลงเอาต์พุต:
cat /etc/passwd /etc/group
cat /etc/group /etc/passwd
โปรดทราบว่าบน Linux (โดยเฉพาะ) GNU getopt()
นั้นมีแนวโน้มที่จะจัดลำดับบรรทัดคำสั่งใหม่เพื่อให้ตัวเลือกทั้งหมด (เริ่มต้นด้วยเครื่องหมายลบ) ได้รับการประมวลผลก่อนอาร์กิวเมนต์อื่น ๆ - เว้นแต่คุณจะใช้ double-dash --
เพื่อทำเครื่องหมายจุดสิ้นสุดของ อาร์กิวเมนต์หรือยกเว้นว่าคุณตั้งค่าตัวแปรสภาพแวดล้อม POSIXLY_CORRECT
เฉพาะในกรณีที่คุณมี 2 ตัวเลือกที่ไม่เหมือนกัน มิฉะนั้นคำสั่งจะไม่สำคัญ
แน่นอนว่าสิ่งนี้อาจแตกต่างกันไปขึ้นอยู่กับการเขียนโปรแกรม แต่ควรใช้กับเครื่องมือ * nix ปกติทั้งหมด
ยากที่จะรู้ว่าคนอื่นบอกคุณแล้วมันอาจสร้างความแตกต่าง (หรือไม่)
กฎง่ายๆคือการเปิดหน้าคนและดูตัวอย่างแรกและใช้คำสั่งนั้นเมื่อใส่อาร์กิวเมนต์ในนั้น
ดังนั้นถ้าเราดูคำสั่ง cat (man cat):
SYNOPSIS
cat [OPTION] [FILE]...
ดูเหมือนว่าตราบใดที่ตัวเลือกทั้งหมดอยู่ก่อนไฟล์ที่คุณควรจะใช้ได้
และถ้าเราดูสัตว์ gcc (man gcc):
SYNOPSIS
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-pedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
Only the most useful options are listed here; see below for the remainder. g++ accepts mostly
the same options as gcc.
มันไม่ง่ายที่จะเข้าใจเหมือนคำสั่ง cat :)
แต่ถ้าคุณต้องการเล่นให้ปลอดภัย - c ดูเหมือนจะมาก่อน -O แล้ว infile (hello.c) น่าจะเป็นครั้งสุดท้าย
gcc -c -O hello.c
แต่อย่างที่คุณรู้เพราะคนอื่น ๆ ทำงาน ... นี่มันเล่นได้อย่างปลอดภัย :)
-static-libstdc++
อย่างไร