บนระบบ Unix gcc จะค้นหาไฟล์ส่วนหัวที่ไหน?
ฉันใช้เวลาเล็กน้อยในเช้านี้เพื่อค้นหาไฟล์ส่วนหัวของระบบดังนั้นฉันคิดว่านี่จะเป็นข้อมูลที่ดีที่จะมีที่นี่
บนระบบ Unix gcc จะค้นหาไฟล์ส่วนหัวที่ไหน?
ฉันใช้เวลาเล็กน้อยในเช้านี้เพื่อค้นหาไฟล์ส่วนหัวของระบบดังนั้นฉันคิดว่านี่จะเป็นข้อมูลที่ดีที่จะมีที่นี่
คำตอบ:
`gcc -print-prog-name=cc1plus` -v
คำสั่งนี้จะถาม GCC ซึ่งc ++ preprocessor จะใช้แล้วถามว่า preprocessor ที่จะมองหารวมถึง
คุณจะได้รับคำตอบที่เชื่อถือได้สำหรับการตั้งค่าเฉพาะของคุณ
เช่นเดียวกันสำหรับตัวประมวลผลล่วงหน้าC :
`gcc -print-prog-name=cpp` -v
cpp
แทนcc1
? เมื่อ jessie debian ของฉัน$(gcc -print-prog-name=cpp) -v
(ถูกต้อง) ให้อีกหนึ่งเส้นทางซึ่งก็คือ/usr/include/x86_64-linux-gnu
/dev/null
`gcc -print-prog-name=cc1` -v < /dev/null
Ctrl
+ D
ซึ่งจะส่ง "end of file" ใน Unix-talk
นอกจากนี้ gcc จะค้นหาไดเรกทอรีที่ระบุหลังจาก-I
ตัวเลือก
คุณสามารถสร้างไฟล์ที่พยายามรวมส่วนหัวของระบบปลอม หากคุณรัน 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
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
หรือcpp -v < /dev/null
เพียงพอ คุณเพียงแค่ต้องให้ตัวประมวลผลล่วงหน้ารันไม่สำคัญว่าจะเห็นอินพุตอะไร (เส้นทางการค้นหาจะถูกพิมพ์ในระหว่างการเริ่มต้นก่อนที่มันจะดูที่อินพุตของมัน)
ส่วนCPPของคู่มือ GCCระบุว่าไฟล์ส่วนหัวอาจอยู่ในไดเรกทอรีดังต่อไปนี้:
GCC มองหาส่วนหัวที่แตกต่างกันหลายแห่ง บนระบบ Unix ปกติหากคุณไม่ได้สั่งเป็นอย่างอื่นระบบจะค้นหาส่วนหัวที่ร้องขอด้วย #include ใน:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
สำหรับโปรแกรม C ++ มันจะดูใน / usr / include / g ++ - v3 ก่อน
หากต้องการให้ 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)
g++ -print-search-dirs
gcc -print-search-dirs
ชุดของพา ธ ที่คอมไพเลอร์ค้นหาไฟล์ส่วนหัวสามารถตรวจสอบได้โดยคำสั่ง: -
cpp -v
หากคุณประกาศ#include ""คอมไพเลอร์จะค้นหาครั้งแรกในไดเรกทอรีปัจจุบันของไฟล์ต้นฉบับและหากไม่พบให้ทำการค้นหาในไดเรกทอรีที่เรียกมาข้างต้นต่อไป
หากคุณประกาศ#include <>คอมไพเลอร์จะค้นหาโดยตรงในไดเรกทอรีที่ได้รับจากคำสั่งด้านบน
ที่มา: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
หนึ่งสามารถดูเส้นทาง (เพิ่มเติม) รวมสำหรับโปรแกรม C จากทุบตีโดยการตรวจสอบต่อไปนี้:
echo $C_INCLUDE_PATH
หากนี่ว่างเปล่ามันสามารถแก้ไขเพื่อเพิ่มสถานที่รวมค่าเริ่มต้นโดย
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
นี่คือไดเรกทอรีที่ 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 ไฟล์ส่วนหัวอาจรวมอยู่ด้วยการใช้บั้ง