จะทราบได้อย่างไรว่าไฟล์ส่วนหัวมาจากไหน?


102

ฉันจะทราบได้อย่างไรว่า g ++ สามารถค้นหาไฟล์รวมได้อย่างไร โดยทั่วไปถ้าฉัน

#include <foo.h>

g ++ จะสแกนเส้นทางการค้นหาโดยใช้ตัวเลือกรวมใด ๆ เพื่อเพิ่มหรือแก้ไขเส้นทาง แต่ในตอนท้ายของวันมีวิธีใดบ้างที่ฉันสามารถบอกเส้นทางสัมบูรณ์ของ foo.h ที่ g ++ เลือกรวบรวมได้? เกี่ยวข้องโดยเฉพาะอย่างยิ่งหากมี foo.h มากกว่าหนึ่งรายการในเส้นทางการค้นหามากมาย

สั้น ๆ วิธีที่จะทำให้สำเร็จ ... มีวิธีรับ g ++ เพื่อบอกฉันว่าเส้นทางการค้นหาสุดท้ายคืออะไรหลังจากรวมค่าเริ่มต้นและตัวเลือกทั้งหมดรวมถึง?


1
ที่เกี่ยวข้อง: มีวิธีใดบ้างที่จะบอกได้ว่าพาเรนต์ใดที่รวมไฟล์ที่เด็กรวมไฟล์มาจาก? คือแสดงกราฟรวมจาก (คำแนะนำ: gcc -E ไม่ค่อยมี ... อาจถูกประมวลผลเพื่อให้ได้ผลลัพธ์)
Krazy Glew

คำตอบ:


78

สิ่งนี้จะทำให้การอ้างอิงซึ่งแสดงรายการพา ธ สัมบูรณ์ของไฟล์รวม:

gcc  -M showtime.c

หากคุณไม่ต้องการให้ระบบมี (เช่น#include <something.h>) ให้ใช้:

gcc  -MM showtime.c

18
ควรสังเกตว่าหากคุณใช้ร่วมกับ "-o myObj.o" เอาต์พุตไม่ใช่ไบนารีที่คอมไพล์แล้วจะเข้าสู่ "myObj.o" -M มีนัย -E ดังนั้นการคอมไพล์จึงไม่เป็นไปตามข้อกำหนด ฉันพบว่า -MD เป็นตัวเลือกที่มีประโยชน์มาก แต่จะทำการคอมไพล์และใส่ผลลัพธ์ใน myObj.d แทน การสร้างพารามิเตอร์ที่เหมาะสมสำหรับการป้อนล่วงหน้าในบรรทัดคอมไพล์ของคุณโดยไม่มีเอฟเฟกต์แปลก ๆ เช่น * .o ตอนนี้มีเอาต์พุตแทนไบนารี ขอบคุณสำหรับความช่วยเหลือของคุณ.
harschware

ตัวเลือกทั้งหมด GCC ที่เกี่ยวข้องจะมีการอธิบายที่นี่
Akhan

111
g++ -H ...

จะพิมพ์เส้นทางแบบเต็มของไฟล์รวมในรูปแบบที่แสดงว่าส่วนหัวใดรวมอยู่ด้วย


7
สิ่งนี้ดูเหมือนจะมีประโยชน์มากกว่า -M จากประสบการณ์ของฉัน ฉันชอบการแสดงลำดับชั้นของสิ่งที่รวมถึงสิ่งที่
Brian Minton

ดีมีประโยชน์สำหรับวัตถุประสงค์ในการดีบัก

1
นี่คือคำตอบที่ดีที่สุด คุณสามารถเพิ่มลงในขั้นตอนการสร้างของคุณได้โดยไม่ต้องเปลี่ยนแปลงสิ่งอื่นใด
Timmmm

4
สิ่งนี้ตอบคำถามได้มากกว่าคำตอบที่ยอมรับ ปัญหาที่โชคร้ายเพียงอย่างเดียวคือฉันไม่สามารถหยุด Clang จากการพยายามรวบรวมไฟล์ได้ตามปกติดังนั้นฉันจึงใช้clang++ -MM -H(ซึ่งเป็นการผสมผสานที่มีประโยชน์เล็กน้อย)
rookie1024

@ rookie1024 ใช้clang++ -H -fsyntax-only ...หากคุณต้องการหลีกเลี่ยงการสร้างไฟล์เอาต์พุต (ใช้ได้ผลgccเช่นกัน)
Lekensteyn

8

ใช้ได้แน่นอน

g++ -E -dI  ... (whatever the original command arguments were)

2
โซลูชันนี้มีประโยชน์หลายประการ: 1. คุณสามารถค้นพบการรวมไฟล์ส่วนหัวเดียวหลายไฟล์ (-H และ -M พิมพ์ไฟล์ที่รวมแต่ละไฟล์เพียงครั้งเดียว) 2. คุณสามารถดูได้ว่ารวมอยู่ที่ไหน (ชื่อและหมายเลขบรรทัดของต้นฉบับ รวมคำแนะนำ) 3. ด้วยเหตุนี้คุณจึงสามารถ (!) แยกแยะได้อย่างน่าเชื่อถือว่ามีการรวมส่วนหัวไว้โดยตรงหรือโดยอ้อมหรือทั้งสองอย่าง (สิ่งนี้สำคัญสำหรับการล้างข้อมูล)
hagello

5

หากคุณใช้-MMหรือหนึ่งในตัวเลือกที่เกี่ยวข้อง ( -Mฯลฯ ) คุณจะได้รับเฉพาะรายการส่วนหัวที่รวมอยู่โดยไม่ต้องมีเอาต์พุตก่อนตัวประมวลผลอื่น ๆ ทั้งหมด (ซึ่งดูเหมือนว่าคุณจะได้รับจากg++ -E -dIโซลูชันที่แนะนำ)


g++ -MM t.cct.o: t.ccแสดงให้เห็นถึงการรวมที่ทุกคนไม่เพียง มันต้องการอย่างอื่นหรือไม่?
wallyk

3
ดี - เพื่อความสมบูรณ์คุณสามารถคล้ายกับ MSVC โดยใช้/showIncludesตัวเลือก MSVC จะเยื้องเพื่อแสดงการซ้อนกันของส่วนหัว (ฉันไม่เห็นว่า-Mใน GCC)
Michael Burr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.