ฉันจะบังคับให้ / GCC แสดงคำสั่งได้อย่างไร


277

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

นี่คือผลลัพธ์ที่ฉันเห็น:

  CCLD   libvirt_parthelper
libvirt_parthelper-parthelper.o: In function `main':
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:102: undefined reference to `ped_device_get'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:116: undefined reference to `ped_disk_new'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:122: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
collect2: ld returned 1 exit status
make[3]: *** [libvirt_parthelper] Error 1

สิ่งที่ฉันต้องการเห็นควรคล้ายกับสิ่งนี้:

$ make
gcc -Wall   -c -o main.o main.c
gcc -Wall   -c -o hello_fn.o hello_fn.c
gcc   main.o hello_fn.o   -o main

ขอให้สังเกตว่าตัวอย่างนี้มีgccคำสั่งที่สมบูรณ์ปรากฏขึ้นอย่างไร ตัวอย่างด้านบนแสดงเฉพาะสิ่งต่าง ๆ เช่น "CCLD libvirt_parthelper" ฉันไม่แน่ใจว่าจะควบคุมพฤติกรรมนี้ได้อย่างไร


คุณกำลังใช้งาน makefile หรือเพียงแค่gccคำสั่งหรือไม่?
เครื่องปั่น

20
ลักษณะเช่นนี้KbuildหรือAutotoolsเอาท์พุท ลองmake V=1ดู
jww

คำตอบ:


275

ในการเรียกใช้การรันแบบแห้ง :

make -n

นี่จะแสดงสิ่งที่makeพยายามจะทำ


31
พบว่ามัน :) ทำให้ V = 1 แม้ว่าคำแนะนำข้างต้นของ "make -n" ก็ใช้ได้เช่นกัน :) ขอบคุณสำหรับคำตอบของคุณ
hernejj

76
ความแตกต่างคือmake -nไม่ได้ใช้คำสั่ง ดังนั้นคำตอบที่ถูกต้องคือmake V=1
m-ric

20
make V=1ใช้งานได้หาก Makefile รองรับเท่านั้น makefiles ของ automake ทำเช่นนั้น แต่คนอื่น ๆ ไม่ทำ
larsr

53
สำหรับ CMake ให้ใช้make VERBOSE=1; สำหรับ make V=1autotools
Ruslan

10
@ m-ric หากคุณต้องการเรียกใช้คำสั่งจริงให้พิจารณาmake SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli 郝海东冠状病病六四事件法轮功

175

ไลบรารี makefiles ซึ่งสร้างขึ้นโดย autotools (ที่./configureคุณต้องออก) มักจะมีตัวเลือก verbose ดังนั้นโดยทั่วไปการใช้make VERBOSE=1หรือmake V=1ควรให้คำสั่งเต็ม

แต่สิ่งนี้ขึ้นอยู่กับวิธีสร้างไฟล์ makefile

-dตัวเลือกที่อาจช่วย แต่มันจะทำให้คุณมีเอาท์พุทยาวมาก


60
หมายเหตุ: CMake สร้าง Makefiles สนับสนุนเท่านั้นไม่VERBOSE=1 V=1
blinry

3
V = 1 ทำงานให้ฉันรวบรวม nuttx ด้วย mips-linux-gnu-gcc ขอบคุณ
jcomeau_ictx

141

สร้างวิธีการที่เป็นอิสระจากระบบ

make SHELL='sh -x'

เป็นตัวเลือกอื่น ตัวอย่างMakefile:

a:
    @echo a

เอาท์พุท:

+ echo a
a

ชุดนี้SHELLตัวแปรพิเศษสำหรับmakeและ-xบอกshให้พิมพ์บรรทัดขยายก่อนดำเนินการ

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

ข้อเสียอย่างหนึ่งของวิธีนี้คือคุณต้องแน่ใจว่าเชลล์ที่จะใช้คือshซึ่งเป็นค่าเริ่มต้นที่ใช้โดย Make เนื่องจากเป็น POSIX แต่สามารถเปลี่ยนได้ด้วยSHELLตัวแปร make

การทำเช่นนี้sh -vก็ยอดเยี่ยมเช่นกัน แต่ Dash 0.5.7 (Ubuntu 14.04 sh) จะไม่สนใจ-cคำสั่ง (ซึ่งดูเหมือนว่าจะmakeใช้งานอย่างไร) ดังนั้นจึงไม่ทำอะไรเลย

make -p จะสนใจคุณเช่นกันซึ่งจะพิมพ์ค่าของตัวแปรที่ตั้งไว้

CMake สร้าง Makefiles

make VERBOSE=1

ดู: การใช้ CMake กับ GNU Make: ฉันจะดูคำสั่งที่แน่นอนได้อย่างไร


11
แน่นอนคำตอบที่ดีที่สุดซึ่งไม่ได้ขึ้นอยู่กับวิธีที่ดีเดิม Makefile ถูกเขียน / สร้าง
nodakai

2
หากใครสามารถอธิบาย downvote ได้โปรดแจ้งให้ฉันทราบเพื่อที่ฉันจะได้เรียนรู้และปรับปรุงข้อมูล ;-)
Ciro Santilli 郝海东冠状病病六四事件法轮功

ทำให้SHELL='$$SHELL -x'จะทำให้$SHELLตัวอักษรที่ไม่ได้รับการประเมิน make SHELL="$SHELL -x"จะใช้งานได้
Rick van der Zwet

1
นี้เป็นคำตอบที่ดีที่สุดทั่วไปในทางตรงกันข้ามกับคำตอบอื่น ๆ บางส่วนนี้ไม่ได้ขึ้นอยู่กับการใช้ CMake
Mike76

2
ทำให้ SHELL = 'sh -x' ยอดเยี่ยม!
Jackie Yeh

22

ตั้งแต่ GNU Make เวอร์ชัน 4.0 --traceอาร์กิวเมนต์เป็นวิธีที่ดีในการบอกว่าอะไรและทำไม makefile ถึงทำเช่นนั้น

makefile:8: target 'foo.o' does not exist

หรือ

makefile:12: update target 'foo' due to: bar

1
อาร์กิวเมนต์นี้พิมพ์ข้อมูลรายละเอียดมากกว่าการรันแบบแห้ง มันมีประโยชน์มากในการทำความเข้าใจกับระบบที่มีกระบวนการสร้างที่ซับซ้อนเช่น dpdk
makerj

20

ใช้ make V=1

คำแนะนำอื่น ๆ ที่นี่:

  • make VERBOSE=1 - ไม่ทำงานอย่างน้อยจากการทดลองของฉัน
  • make -n- แสดงการดำเนินการเชิงตรรกะเท่านั้นไม่ใช่บรรทัดคำสั่งที่ถูกเรียกใช้ เช่นCC source.cpp

  • make --debug=j - ใช้งานได้เช่นกัน แต่อาจเปิดใช้งานการสร้างหลายเธรดทำให้เกิดผลลัพธ์เพิ่มขึ้น


4
make VERBOSE=1สำหรับ CMake การทดลองของคุณมีแนวโน้มมากที่สุดกับโครงการที่ใช้ระบบอัตโนมัติของ GNU
Ruslan

12

ฉันชอบที่จะใช้:

make --debug=j

มันแสดงคำสั่งที่รัน:

https://linux.die.net/man/1/make

--debug [= ธง]

พิมพ์ข้อมูลการดีบักนอกเหนือจากการประมวลผลปกติ หากไม่ใส่ FLAGS แสดงว่าพฤติกรรมนั้นเหมือนกับที่-dได้ระบุไว้ FLAGS อาจใช้สำหรับการดีบั๊กเอาท์พุททั้งหมด (เช่นเดียวกับการใช้-d) bสำหรับการดีบักพื้นฐานสำหรับการดีบักพื้นฐานที่vละเอียดมากขึ้นiสำหรับการแสดงกฎโดยนัยjสำหรับรายละเอียดเกี่ยวกับการเรียกใช้คำสั่งและmสำหรับการดีบักในขณะที่ทำการสร้างใหม่


7

คุณยังสามารถใช้สิ่งนี้ขึ้นอยู่กับรุ่น automake ของคุณ:

make AM_DEFAULT_VERBOSITY=1

การอ้างอิง: AM_DEFAULT_VERBOSITY

หมายเหตุ: ฉันเพิ่มคำตอบนี้เนื่องจากV=1ไม่ได้ผลสำหรับฉัน

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