gcc มองหาไฟล์ส่วนหัว C และ C ++ ที่ไหน


186

บนระบบ Unix gcc จะค้นหาไฟล์ส่วนหัวที่ไหน?

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

คำตอบ:


227
`gcc -print-prog-name=cc1plus` -v

คำสั่งนี้จะถาม GCC ซึ่งc ++ preprocessor จะใช้แล้วถามว่า preprocessor ที่จะมองหารวมถึง

คุณจะได้รับคำตอบที่เชื่อถือได้สำหรับการตั้งค่าเฉพาะของคุณ

เช่นเดียวกันสำหรับตัวประมวลผลล่วงหน้าC :

`gcc -print-prog-name=cpp` -v

2
`s หมายถึงอะไร ฉันพบว่ามันยากที่จะค้นหาสิ่งนี้
mijiturka


5
ฉันเดา C preprocessorเป็นcppแทนcc1? เมื่อ jessie debian ของฉัน$(gcc -print-prog-name=cpp) -v(ถูกต้อง) ให้อีกหนึ่งเส้นทางซึ่งก็คือ/usr/include/x86_64-linux-gnu
wlnirvana

3
หากคุณต้องการที่จะได้แขวนรอสำหรับการป้อนข้อมูลเข้าเปลี่ยนเส้นทางจากดังนั้น/dev/null `gcc -print-prog-name=cc1` -v < /dev/null
Steve Jorgensen

@SteveJorgensen อ๋อ! หรือกดCtrl+ Dซึ่งจะส่ง "end of file" ใน Unix-talk
Drew Dormann

40

นอกจากนี้ gcc จะค้นหาไดเรกทอรีที่ระบุหลังจาก-Iตัวเลือก



4
@totaam: ตรวจสอบแบบอักษรของคุณ! คำตอบนี้ใช้ "-I" (ตัวพิมพ์ใหญ่ "ตา") ไม่ใช่ "-l" (ตัวพิมพ์เล็ก "ell")

3
-I ใช้สำหรับ <anglebracketed.h> ในขณะที่ -iquote ใช้สำหรับ "quotefiles.h"
jcomeau_ictx

28

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

$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c

[..]

#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-apple-darwin9/4.0.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.

[..]

t.c:1:32: error: bogus.h: No such file or directory

3
ฉันคิดว่ามันจะมีประโยชน์มากขึ้นถ้าคุณเพิ่งพูดว่า "ใช้ตัวเลือก -v"
Jay Conrod

ถ้าคุณใช้ "-v" โดยไม่มีไฟล์ C ที่มีส่วนหัวของระบบที่ไม่มีอยู่คุณจะไม่ทำให้ gcc ซ้ำผ่านเส้นทางรวมทั้งหมด กุญแจสำคัญในคำตอบของฉันคือ bogus.h แสดงรายการเป็นส่วนหัวของระบบ
diciu

@ เจย์ - คุณพูดถูกมันคลุมเครือเกินไป - ฉันอธิบายสิ่งที่ฉันทำในสคริปต์เชลล์
diciu

9
ไม่มีไฟล์ชั่วคราว:echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe

2
gcc -v -E - < /dev/nullหรือcpp -v < /dev/nullเพียงพอ คุณเพียงแค่ต้องให้ตัวประมวลผลล่วงหน้ารันไม่สำคัญว่าจะเห็นอินพุตอะไร (เส้นทางการค้นหาจะถูกพิมพ์ในระหว่างการเริ่มต้นก่อนที่มันจะดูที่อินพุตของมัน)
zwol

17

ส่วนCPPของคู่มือ GCCระบุว่าไฟล์ส่วนหัวอาจอยู่ในไดเรกทอรีดังต่อไปนี้:

GCC มองหาส่วนหัวที่แตกต่างกันหลายแห่ง บนระบบ Unix ปกติหากคุณไม่ได้สั่งเป็นอย่างอื่นระบบจะค้นหาส่วนหัวที่ร้องขอด้วย #include ใน:

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

สำหรับโปรแกรม C ++ มันจะดูใน / usr / include / g ++ - v3 ก่อน


ไม่เป็นไรสำหรับ gcc รุ่นปัจจุบันของคุณ ไดเรกทอรีจริงที่มันดูขึ้นอยู่กับตัวเลือกที่ระบุเมื่อ gcc ถูกสร้างขึ้น ดูคำตอบ Shmoopty สำหรับทางออกที่ดีกว่า
Martin York

PS: ไฟล์ส่วนหัว C ++ ของฉันอยู่ใน: /usr/include/c++/4.0.0
Martin York

3
@ มาร์ติน: คุณเป็นโรงเรียนเก่า ของฉันอยู่ใน / usr/include/c++/4.2 :)
Bill the Lizard

10

หากต้องการให้ GCC พิมพ์ชุดไดเรกทอรีที่สมบูรณ์ซึ่งจะค้นหาส่วนหัวของระบบให้เรียกใช้ดังนี้:

$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | 
  LC_ALL=C sed -ne '/starts here/,/End of/p'

ซึ่งจะสร้างผลลัพธ์ของแบบฟอร์ม

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/5/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

หากคุณมี-Iตัวเลือก - ครอบครัวบนบรรทัดคำสั่งจะมีผลกับสิ่งที่พิมพ์ออกมา

( sedคำสั่งคือการกำจัดอื่น ๆทั้งหมดขยะการพิมพ์นี้เรียกใช้และLC_ALL=Cเพื่อให้แน่ใจว่าsedคำสั่งใช้งานได้ - วลี "เริ่มต้นที่นี่" และ "สิ้นสุดรายการค้นหา" จะถูกแปล IIRC)


9
g++ -print-search-dirs
gcc -print-search-dirs

3
คำสั่งเหล่านี้พิมพ์พา ธ การค้นหาเริ่มต้นสำหรับลิงค์ไลบรารีและส่วนประกอบภายในของคอมไพเลอร์ พวกเขาไม่ได้บอกอะไรคุณเกี่ยวกับไฟล์ส่วนหัว
zwol

6

ชุดของพา ธ ที่คอมไพเลอร์ค้นหาไฟล์ส่วนหัวสามารถตรวจสอบได้โดยคำสั่ง: -

cpp -v

หากคุณประกาศ#include ""คอมไพเลอร์จะค้นหาครั้งแรกในไดเรกทอรีปัจจุบันของไฟล์ต้นฉบับและหากไม่พบให้ทำการค้นหาในไดเรกทอรีที่เรียกมาข้างต้นต่อไป

หากคุณประกาศ#include <>คอมไพเลอร์จะค้นหาโดยตรงในไดเรกทอรีที่ได้รับจากคำสั่งด้านบน

ที่มา: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026


1

หนึ่งสามารถดูเส้นทาง (เพิ่มเติม) รวมสำหรับโปรแกรม C จากทุบตีโดยการตรวจสอบต่อไปนี้:

echo $C_INCLUDE_PATH

หากนี่ว่างเปล่ามันสามารถแก้ไขเพื่อเพิ่มสถานที่รวมค่าเริ่มต้นโดย

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include

1

นี่คือไดเรกทอรีที่ gcc ค้นหาตามค่าเริ่มต้นสำหรับไฟล์ส่วนหัวที่ระบุ (ระบุว่าไฟล์ส่วนหัวจะรวมอยู่ในเครื่องหมายบั้ง <>); 1. / usr / local / include / - ใช้สำหรับไฟล์ส่วนหัวของบุคคลที่สาม 2. / usr / include / - ใช้สำหรับไฟล์ส่วนหัวของระบบ

หากในกรณีที่คุณตัดสินใจที่จะวางไฟล์ส่วนหัวที่กำหนดเองของคุณในสถานที่อื่นนอกเหนือจากไดเรกทอรีที่กล่าวถึงข้างต้นคุณสามารถรวมไว้ดังต่อไปนี้: 1. ใช้เครื่องหมายคำพูด ("./custom_header_files/foo.h") พร้อมเส้นทางไฟล์แทนเครื่องหมายบั้ง ในคำสั่ง include 2. ใช้สวิตช์ -I เมื่อทำการคอมไพล์โค้ด gcc -I / home / user / custom_headers / -c foo.c -p foo.o โดยทั่วไปแล้วสวิตช์ -I จะบอกคอมไพเลอร์ให้ค้นหาในไดเรกทอรีที่ระบุด้วยสวิตช์ -I ก่อน (ก่อนตรวจสอบไดเรกทอรีมาตรฐาน) การใช้สวิตช์ -I ไฟล์ส่วนหัวอาจรวมอยู่ด้วยการใช้บั้ง

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