Việc biên dịch chương trình C ++ bao gồm ba bước:
Tiền xử lý: bộ tiền xử lý lấy tệp mã nguồn C ++ và xử lý các chỉ thị #include
s, #define
s và các bộ xử lý tiền xử lý khác. Đầu ra của bước này là tệp C ++ "thuần túy" không có chỉ thị tiền xử lý.
Biên dịch: trình biên dịch lấy đầu ra của bộ xử lý trước và tạo một tệp đối tượng từ nó.
Liên kết: trình liên kết lấy các tệp đối tượng được tạo bởi trình biên dịch và tạo thư viện hoặc tệp thực thi.
Sơ chế
Bộ tiền xử lý xử lý các chỉ thị tiền xử lý , như #include
và #define
. Không rõ về cú pháp của C ++, đó là lý do tại sao nó phải được sử dụng cẩn thận.
Nó hoạt động trên một file C ++ nguồn tại một thời điểm bằng cách thay thế #include
chỉ thị với nội dung của các tập tin tương ứng (mà thường chỉ là tờ khai), làm thay macro ( #define
), và chọn các phần khác nhau của văn bản phụ thuộc vào #if
, #ifdef
và #ifndef
chỉ thị.
Bộ tiền xử lý hoạt động trên luồng mã thông báo tiền xử lý. Thay thế macro được định nghĩa là thay thế các mã thông báo bằng các mã thông báo khác (toán tử ##
cho phép hợp nhất hai mã thông báo khi có ý nghĩa).
Sau tất cả điều này, bộ tiền xử lý tạo ra một đầu ra duy nhất là một luồng mã thông báo do các biến đổi được mô tả ở trên. Nó cũng thêm một số dấu hiệu đặc biệt cho trình biên dịch biết mỗi dòng đến từ đâu để nó có thể sử dụng các dấu này để tạo ra các thông báo lỗi hợp lý.
Một số lỗi có thể được tạo ra ở giai đoạn này với việc sử dụng thông minh các chỉ thị #if
và #error
chỉ thị.
Biên soạn
Bước biên dịch được thực hiện trên mỗi đầu ra của bộ tiền xử lý. Trình biên dịch phân tích mã nguồn C ++ thuần túy (bây giờ không có bất kỳ chỉ thị tiền xử lý nào) và chuyển đổi nó thành mã lắp ráp. Sau đó gọi back-end bên dưới (trình biên dịch trong chuỗi công cụ) để lắp mã đó thành mã máy tạo ra tệp nhị phân thực tế ở một số định dạng (ELF, COFF, a.out, ...). Tệp đối tượng này chứa mã được biên dịch (ở dạng nhị phân) của các ký hiệu được xác định trong đầu vào. Biểu tượng trong các tệp đối tượng được gọi bằng tên.
Các tệp đối tượng có thể tham chiếu đến các ký hiệu không được xác định. Đây là trường hợp khi bạn sử dụng khai báo và không cung cấp định nghĩa cho nó. Trình biên dịch không quan tâm đến điều này và sẽ vui vẻ tạo ra tệp đối tượng miễn là mã nguồn được định dạng tốt.
Trình biên dịch thường cho phép bạn dừng biên dịch vào thời điểm này. Điều này rất hữu ích vì với nó, bạn có thể biên dịch từng tệp mã nguồn riêng biệt. Ưu điểm này cung cấp là bạn không cần biên dịch lại mọi thứ nếu bạn chỉ thay đổi một tệp duy nhất.
Các tệp đối tượng được sản xuất có thể được đặt trong kho lưu trữ đặc biệt gọi là thư viện tĩnh, để dễ dàng sử dụng lại sau này.
Ở giai đoạn này, các lỗi trình biên dịch "thông thường", như lỗi cú pháp hoặc lỗi giải quyết quá tải không thành công, được báo cáo.
Liên kết
Trình liên kết là thứ tạo ra đầu ra biên dịch cuối cùng từ các tệp đối tượng mà trình biên dịch tạo ra. Đầu ra này có thể là thư viện dùng chung (hoặc động) (và mặc dù tên tương tự, nhưng chúng không có nhiều điểm chung với các thư viện tĩnh được đề cập trước đó) hoặc có thể thực thi được.
Nó liên kết tất cả các tệp đối tượng bằng cách thay thế các tham chiếu đến các ký hiệu không xác định bằng các địa chỉ chính xác. Mỗi ký hiệu này có thể được định nghĩa trong các tệp đối tượng khác hoặc trong các thư viện. Nếu chúng được định nghĩa trong các thư viện khác với thư viện chuẩn, bạn cần nói với người liên kết về chúng.
Ở giai đoạn này, các lỗi phổ biến nhất là thiếu định nghĩa hoặc định nghĩa trùng lặp. Điều này có nghĩa là các định nghĩa không tồn tại (nghĩa là chúng không được viết) hoặc các tệp đối tượng hoặc thư viện nơi chúng cư trú không được cung cấp cho trình liên kết. Điều thứ hai là rõ ràng: cùng một biểu tượng được xác định trong hai tệp đối tượng hoặc thư viện khác nhau.