2009-12-14 19 views
10

Tôi tự hỏi làm thế nào trình biên dịch trên Mac OS X, Windows và Linux biết nơi để tìm các tập tin tiêu đề C.Trình biên dịch biết nơi để tìm #include <stdio.h>?

Cụ thể tôi tự hỏi làm thế nào nó biết nơi để tìm #include với các dấu ngoặc đơn <>.

#include "/Users/Brock/Desktop/Myfile.h" // absolute reference 
#include <stdio.h>       // system relative reference? 

Tôi giả sử có tệp văn bản trên hệ thống mà nó tư vấn. Làm cách nào để biết nơi tìm tiêu đề? Có thể sửa đổi tập tin này, nếu vậy tập tin này nằm ở đâu trên hệ điều hành?

+0

Xem câu trả lời của tôi cho câu hỏi đó: Tôi đã cập nhật câu hỏi và tôi nghĩ nó sẽ phù hợp với bạn. –

+0

Bạn đã chỉnh sửa bài đăng của mình một lần nữa, làm cho nhận xét của tôi không thể hiểu được. Đây là những gì tôi đang nói về: http://stackoverflow.com/questions/1898837/include-freeimage-h-not-found –

+0

@Alok Tôi đang cố gắng nó ra bây giờ nhờ –

Trả lời

10

Khi trình biên dịch được xây dựng, nó biết về một vài vị trí tiêu chuẩn để tìm tệp tiêu đề. Một số trong số đó độc lập với nơi trình biên dịch được cài đặt (chẳng hạn như/usr/include,/usr/local/include, vv) và một số được dựa trên nơi trình biên dịch được cài đặt (cho gcc, được điều khiển bởi --prefix tùy chọn khi chạy cấu hình).

Các vị trí như/usr/include được biết đến và 'kiến thức' về vị trí đó được xây dựng thành gcc. Các vị trí như/usr/local/include không được coi là hoàn toàn tiêu chuẩn và có thể được đặt khi gcc được tạo bằng tùy chọn cấu hình --with-local-prefix.

Điều đó nói rằng, bạn có thể thêm thư mục mới cho nơi để tìm kiếm bao gồm các tệp bằng tùy chọn trình biên dịch -I dòng lệnh. Khi cố gắng bao gồm một tệp, nó sẽ tìm trong các thư mục được chỉ định với cờ -I trước các thư mục mà tôi đã nói đến trong đoạn đầu tiên.

4

Vị trí của tệp phụ thuộc vào hệ thống. Thật vậy, tệp có thể là precompiled hoặc thậm chí có thể không tồn tại — trình biên dịch có thể có tệp đó dưới dạng 'được tích hợp sẵn'. Trên macbook của tôi, tôi thấy rằng có một tập tin như vậy trong /usr/include/c++/4.2.1/iostream, nhưng bạn không nên dựa vào nó, và nó chắc chắn là một ý tưởng tồi để chỉnh sửa nó.

11

Hệ điều hành không biết nơi tìm các tệp này - trình biên dịch thực hiện (hoặc chính xác hơn, bộ tiền xử lý). Nó có một tập hợp các đường dẫn tìm kiếm nơi nó tìm kiếm các tiêu đề, giống như trình bao lệnh của bạn có một tập hợp các vị trí mà nó sẽ tìm kiếm các chương trình để thực thi khi bạn nhập vào một tên. The GCC documentation explains cách trình biên dịch thực hiện và cách các đường dẫn tìm kiếm này có thể được thay đổi như thế nào.

+0

Upvote cho thông tin tốt và liên kết tài nguyên tốt. Cảm ơn Chuck – bobby

0

Nếu bạn đang sử dụng g ++, bạn có thể làm một cái gì đó như thế này để tìm hiểu những gì bao gồm đường dẫn được tìm kiếm:

touch empty.cpp 
g++ -v empty.cpp 

Tôi không biết nếu có một tương đương cho Xcode. Có lẽ đó sẽ làm việc kể từ Xcode dựa trên GCC?

2

Trong Visual Studio, nó nằm trong cài đặt dự án nếu bạn sử dụng IDE hoặc trong biến môi trường %INCLUDE% nếu bạn sử dụng dòng lệnh.

0

Bạn nên tránh # bao gồm các tệp bằng đường dẫn tuyệt đối. Trình biên dịch tìm kiếm các tệp bao gồm trong các thư mục khác nhau và bao gồm các tệp, bắt đầu từ mỗi thư mục. Ví dụ;

#include <boost/tokenizer.hpp> 

Làm việc vì thư mục gốc tăng có chứa thư mục mặc định hoặc bạn đã làm như thế.

g++ -I$BOOST_ROOT {blah, blah} 

Nó là tiêu chuẩn C và C++ mà tách UNIX '/' sẽ làm việc theo cách tương tự cho tất cả các hệ thống, bất kể những gì hệ thống máy chủ thực sự sử dụng để biểu thị các thư mục. Như những người khác đã đề cập, đôi khi #include không thực sự bao gồm một tệp thực sự.

Các vấn đề liên quan