Trên hệ thống Unix, gcc tìm tệp tiêu đề ở đâu?
Tôi đã dành một ít thời gian sáng nay để tìm kiếm một số tệp tiêu đề hệ thống, vì vậy tôi nghĩ rằng đây sẽ là thông tin tốt để có ở đây.
Trên hệ thống Unix, gcc tìm tệp tiêu đề ở đâu?
Tôi đã dành một ít thời gian sáng nay để tìm kiếm một số tệp tiêu đề hệ thống, vì vậy tôi nghĩ rằng đây sẽ là thông tin tốt để có ở đây.
Câu trả lời:
`gcc -print-prog-name=cc1plus` -v
Lệnh này hỏi gcc bộ tiền xử lý C ++ nào nó đang sử dụng, và sau đó hỏi bộ tiền xử lý đó nơi nó tìm kiếm bao gồm.
Bạn sẽ nhận được một câu trả lời đáng tin cậy cho thiết lập cụ thể của bạn.
Tương tự như vậy, đối với bộ tiền xử lý C :
`gcc -print-prog-name=cpp` -v
cpp
thay vì cc1
? Trên debian jessie của tôi $(gcc -print-prog-name=cpp) -v
(chính xác) đưa ra một con đường nữa, đó là/usr/include/x86_64-linux-gnu
/dev/null
đó `gcc -print-prog-name=cc1` -v < /dev/null
.
Ctrl
+ D
, sẽ gửi "kết thúc tệp" trong Unix-talk.
Ngoài ra, gcc sẽ xem trong các thư mục được chỉ định sau -I
tùy chọn.
Bạn có thể tạo một tệp cố gắng bao gồm một tiêu đề hệ thống không có thật. Nếu bạn chạy gcc ở chế độ dài dòng trên một nguồn như vậy, nó sẽ liệt kê tất cả các hệ thống bao gồm các vị trí như tìm kiếm tiêu đề không có thật.
$ 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
hoặc cpp -v < /dev/null
là đủ. Bạn chỉ cần chạy bộ tiền xử lý để chạy , không quan trọng nó nhìn thấy đầu vào nào. (Các đường dẫn tìm kiếm được in trong khi khởi động, trước khi nó nhìn vào đầu vào của nó.)
Phần CPP của Hướng dẫn GCC chỉ ra rằng các tệp tiêu đề có thể được đặt trong các thư mục sau:
GCC tìm kiếm ở một số nơi khác nhau cho các tiêu đề. Trên một hệ thống Unix bình thường, nếu bạn không hướng dẫn cách khác, nó sẽ tìm kiếm các tiêu đề được yêu cầu với #include trong:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
Đối với các chương trình C ++, đầu tiên, nó cũng sẽ tìm trong / usr / include / g ++ - v3.
Để có được GCC để in ra bộ thư mục hoàn chỉnh nơi nó sẽ tìm kiếm các tiêu đề hệ thống, hãy gọi nó như thế này:
$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 |
LC_ALL=C sed -ne '/starts here/,/End of/p'
Nó sẽ tạo ra đầu ra của mẫu
#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.
Nếu bạn có -I
các tùy chọn -f Family trên dòng lệnh, chúng sẽ ảnh hưởng đến những gì được in ra.
(Các sed
lệnh là để thoát khỏi tất cả các khác rác gọi này in, và LC_ALL=C
là để đảm bảo rằng các sed
công trình lệnh - sự "bắt đầu ở đây" và "End của danh sách tìm kiếm" cụm từ được dịch IIRC.)
g++ -print-search-dirs
gcc -print-search-dirs
Tập hợp các đường dẫn mà trình biên dịch tìm kiếm các tệp tiêu đề có thể được kiểm tra bằng lệnh: -
cpp -v
Nếu bạn khai báo #include "" , trình biên dịch sẽ tìm kiếm đầu tiên trong thư mục hiện tại của tệp nguồn và nếu không tìm thấy, tiếp tục tìm kiếm trong các thư mục đã truy xuất ở trên.
Nếu bạn khai báo #include <> , trình biên dịch sẽ tìm kiếm trực tiếp trong các thư mục thu được từ lệnh trên.
Nguồn: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
Người ta có thể xem đường dẫn bao gồm (bổ sung) cho chương trình C từ bash bằng cách kiểm tra các mục sau:
echo $C_INCLUDE_PATH
Nếu điều này là trống, nó có thể được sửa đổi để thêm các vị trí bao gồm mặc định, bởi:
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
Đây là các thư mục mà gcc nhìn theo mặc định cho các tệp tiêu đề đã chỉ định (với điều kiện là các tệp tiêu đề được bao gồm trong chevrons <>); 1. / usr / local / include / - used cho các tệp tiêu đề của bên thứ 3. 2. / usr / include / - được sử dụng cho các tệp tiêu đề hệ thống.
Nếu trong trường hợp bạn quyết định đặt tệp tiêu đề tùy chỉnh của mình ở một nơi khác ngoài các thư mục được đề cập ở trên, bạn có thể bao gồm chúng như sau: 1. sử dụng dấu ngoặc kép ("./custom_header_files/foo.h") với đường dẫn tệp, thay vì chevrons trong tuyên bố bao gồm. 2. sử dụng công tắc -I khi biên dịch mã. gcc -I / home / user / custom_headers / -c foo.c -p foo.o Về cơ bản, công tắc -I bảo trình biên dịch tìm kiếm đầu tiên trong thư mục được chỉ định bằng công tắc -I (trước khi nó kiểm tra các thư mục chuẩn). bằng cách sử dụng chuyển đổi -I, các tệp tiêu đề có thể được bao gồm bằng chevron.