Trường hợp gcc tìm tệp tiêu đề C và C ++?


185

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:


227
`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

2
Ý nghĩa của nó là gì? Tôi đang gặp khó khăn để tìm kiếm này.
mijiturka


5
Tôi đoán tiền xử lý C là cppthay 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
wlnirvana

3
Nếu bạn muốn không treo chờ đầu vào, hãy chuyển hướng đầu vào từ /dev/nullđó `gcc -print-prog-name=cc1` -v < /dev/null.
Steve Jorgensen

@SteveJorgensen vâng! Hoặc nhấn Ctrl+ D, sẽ gửi "kết thúc tệp" trong Unix-talk.
Drew Dormann

40

Ngoài ra, gcc sẽ xem trong các thư mục được chỉ định sau -Itùy chọn.



4
@totaam: Kiểm tra phông chữ của bạn! Câu trả lời này sử dụng "-I" (viết hoa "mắt") chứ không phải "-l" (chữ thường "ell").

3
-Tôi dành cho <anglebrqueted.h> trong khi -iquote dành cho "quoteedfiles.h"
jcomeau_ictx 22/07/14

28

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

3
Tôi nghĩ rằng điều này sẽ hữu ích hơn nếu bạn chỉ nói "sử dụng tùy chọn -v".
Jay Conrod

Chà, nếu bạn sử dụng "-v" mà không có tệp C bao gồm tiêu đề hệ thống không tồn tại, bạn sẽ không khiến gcc lặp đi lặp lại qua tất cả các đường dẫn bao gồm. Chìa khóa cho câu trả lời của tôi là bogus.h được liệt kê dưới dạng tiêu đề hệ thống.
diciu

@Jay - bạn nói đúng, nó quá mơ hồ - Tôi đã giải thích những gì tôi đang làm trong kịch bản shell.
diciu

9
không có tập tin tạm thời:echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe

2
gcc -v -E - < /dev/nullhoặc cpp -v < /dev/nulllà đủ. 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ó.)
zwol

17

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.


Điều đó tốt cho phiên bản gcc hiện tại của bạn. Các thư mục thực tế mà nó nhìn vào phụ thuộc vào các tùy chọn được chỉ định khi gcc được xây dựng. Xem câu trả lời của Shmoopty để có giải pháp tốt hơn.
Martin York

PS: Các tệp tiêu đề C ++ của tôi nằm trong: /usr/include/c++/4.0.0
Martin York

3
@Martin: Bạn là trường học cũ. Của tôi đang ở /usr/include/c++/4.2 :)
Bill the Lizard

10

Để 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ó -Icá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 sedlệnh là để thoát khỏi tất cả các khác rác gọi này in, và LC_ALL=Clà để đảm bảo rằng các sedcô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.)


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

3
Các lệnh này in các đường dẫn tìm kiếm mặc định cho các thư viện liên kết và các thành phần bên trong của trình biên dịch; họ không cho bạn biết bất cứ điều gì về các tập tin tiêu đề.
zwol

6

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


1

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

1

Đâ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.