ไฟล์. h.gch คืออะไร


116

ฉันเพิ่งมีโปรเจ็กต์คลาสที่ฉันต้องทำโปรแกรมด้วย G ++

ฉันใช้ makefile และบางครั้งก็ทิ้งไฟล์. h.gch ไว้ข้างหลังด้วยเหตุผลบางประการ

บางครั้งสิ่งนี้ไม่ได้ส่งผลต่อการคอมไพล์ แต่บ่อยครั้งที่คอมไพเลอร์ออกข้อผิดพลาดสำหรับปัญหาที่ได้รับการแก้ไขแล้วหรือไม่สมเหตุสมผล

ฉันมีสองคำถาม:

1) ไฟล์. h.gch คืออะไรและใช้ทำอะไร และ

2) เหตุใดจึงเกิดปัญหาเช่นนี้เมื่อไม่ได้ทำความสะอาด


13
gcc สร้างขึ้นหากคุณตั้งใจบอกให้คอมไพล์ไฟล์. h อย่าทำอย่างนั้น :) (จริงถ้าคุณต้องการที่จะสร้างหัว precompiled)
jalf

3
นอกGCCโลก.gchไฟล์จะถูกเรียกว่า.pch
Patapoom

คำตอบ:


115

.gchไฟล์เป็นหัว precompiled

หาก.gchไม่พบa ก็จะใช้ไฟล์ส่วนหัวปกติ

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

บางครั้งข้อมูล*.h.gchอาจเสียหายหรือมีข้อมูลที่ล้าสมัยดังนั้นการลบไฟล์นั้นและรวบรวมอีกครั้งควรแก้ไขได้


1
แล้วทำไมขนาดของ. gch จึงใหญ่ขนาดนี้?
NAND

38

หากคุณต้องการทราบเกี่ยวกับไฟล์เพียงพิมพ์บนเทอร์มินัล

file filename

file a.h.gch ให้:

GCC precompiled header (version 013) for C

2
Mine (OSX, zsh) เพียงแค่พูดว่า "data" สำหรับ.h.gchไฟล์ ฉันสงสัยว่าคุณต้องการไฟล์ฐานข้อมูลที่เหมาะสมสำหรับสิ่งนี้
Ondrej Slinták


17

ก) เป็นส่วนหัวที่คอมไพล์ไว้ล่วงหน้า: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

b) มีข้อมูล "แคช" จากไฟล์. h และควรอัปเดตทุกครั้งที่คุณเปลี่ยนไฟล์. h ตามลำดับ หากไม่เกิดขึ้นแสดงว่าคุณตั้งค่าการอ้างอิงไม่ถูกต้องในโครงการของคุณ


15

คำตอบอื่น ๆ มีความถูกต้องสมบูรณ์เกี่ยวกับไฟล์ gch คืออะไร อย่างไรก็ตามบริบท (ในกรณีนี้ผู้เริ่มต้นใช้ g ++) คือทุกอย่าง ในบริบทนี้มีกฎสองข้อ:

  1. ไม่เคยใส่ไฟล์. h ในบรรทัดคอมไพล์ g ++ เฉพาะไฟล์. cpp หากไฟล์. h ถูกคอมไพล์โดยไม่ได้ตั้งใจให้ลบไฟล์ * .gch ใด ๆ

  2. ไม่เคยใส่ไฟล์. cpp ในคำสั่ง #include

หากกฎข้อหนึ่งผิดในบางจุดปัญหาที่อธิบายไว้ในคำถามจะเกิดขึ้น หากกฎข้อที่สองผิดในบางจุดผู้เชื่อมโยงจะบ่นเกี่ยวกับสัญลักษณ์ที่กำหนดแบบทวีคูณ


2
สำหรับจุดที่ 1 ฉันจะใช้ฟังก์ชันเป็นตัวอย่าง ก่อนที่โปรแกรมเมอร์จะสามารถเรียก myfunc () โปรแกรมเมอร์จะต้องอธิบาย myfunc () ให้กับคอมไพเลอร์โดยใช้ต้นแบบฟังก์ชัน หากไฟล์. cpp ที่แตกต่างกันหลายไฟล์เรียก myfunc () ต้องมีต้นแบบใน. เป็นข้อผิดพลาดที่มักจะพิมพ์ต้นแบบในไฟล์. cpp แต่ละไฟล์ ดังนั้นต้นแบบฟังก์ชันจึงถูกวางไว้ในไฟล์. h ซึ่งเป็น # รวมอยู่ในไฟล์. cpp แต่ละไฟล์ที่เรียกว่า myfunc ไฟล์ส่วนหัวมีเฉพาะข้อมูลสำหรับคอมไพลเลอร์ไม่ใช่โค้ดที่เรียกใช้งาน ดังนั้นการวางไฟล์. h ในบรรทัด g ++ จึงไม่มีความหมาย
tgibson

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