Trình biên dịch gcc

Một phần của tài liệu Quan-tri-mang-nuy-vn-17308_-_He_dieu_hanh_ma_nguon_mo.pdf (Trang 79 - 81)

Hệ điều hành UNIX luôn kèm theo bộ dịch ngôn ngữ lập trình C với tên gọi là cc (C compiler). Trong Linux, bộ dịch có tên là gcc (GNU C Compiler) với ngôn ngữ lập trình không khác nhiều với C chuẩn. gcc cho ngƣời lập trình kiểm tra trình biên dịch. Tiến trình biên dịch bao gồm bốn giai đoạn:

Tiền xử lý Biên dịch Tập hợp Liên kết

Ta có thể dừng tiến trình sau một trong những giai đoạn để kiểm tra kết quả biên dịch tại giai đoạn ấy. gcc cũng có thể chấp nhận ngôn ngữ khác của C, nhƣ ANSI C hay C truyền thống. Nhƣ đã nói ở trên, gcc thích hợp biên dịch C++ hay Objective-C. Ta có thể kiểm soát lƣợng cũng nhƣ kiểu thông tin cần debug, tất nhiên là có thể nhúng trong tiến trình nhị phân hóa kết quả và giống nhƣ hầu hết các trình biên dịch, gcc cũng thực hiện tối ƣu hóa mã.

Trƣớc khi bắt đầu đi sâu vào nghiên cứu gcc, ta xem một ví dụ sau:

#include<stdio.h> int main (void) {

fprintf( stdout, “Hello, Linux programming world!\n”); return 0;

}

Mt chƣơng trình đin hình dùng để minh hovic sdng gcc

Để biên dịch và chạy chƣơng trình này hãy gõ:

$ gcc hello.c –o hello $ ./hello

Hello, Linux programming world!

Dòng lệnh đầu tiên chỉ cho gcc phải biên dịch và liên kết file nguồn hello.c, tạo ra tập tin thực thi, bằng cách chỉ định sử dụng đối số -o hello. Dòng lệnh thứ hai thực hiện chƣơng trình, và kết quả cho ra trên dòng thứ 3.

Có nhiều chỗ mà ta không nhìn thấy đƣợc, gcc trƣớc khi chạy hello.c thông qua bộ tiền xử lý của cpp, để mở rộng bất kỳ một macro nào và chèn thêm vào nội dung của những file

#include. Tiếp đến, nó biên dịch mã nguồn tiền xử lý sang mã obj . Cuối cùng, trình liên kết, tạo ra mã nhị phân cho chƣơng trình hello.

- 79 -

Ta có thể tạo lại từng bƣớc này bằng tay, chia thành từng bƣớc qua tiến trình biên dịch. Để chỉ cho gcc biết phải dừng việc biên dịch sau khi tiền xử lý, ta sử dụng tuỳ chọn –E của

gcc:

$ gcc –E hello.c –o hello.cpp

Xem xét hello.cpp và ta có thể thấy nội dung của stdio.h đƣợc chèn vào file, cùng với những mã thông báo tiền xử lý khác. Bƣớc tiếp theo là biên dịch hello.cpp sang mã obj. Sử dụng tuỳ chọn –c của gcc để hoàn thành:

$ gcc –x cpp-output -c hello.cpp –o hello.o

Trong trƣờng hợp này, ta không cần chỉ định tên của file output bởi vì trình biên dịch tạo một tên file obj bằng cách thay thế .c bởi .o. Tuỳ chọn –x chỉ cho gcc biết bắt đầu biên dịch ở bƣớc đƣợc chỉ báo trong trƣờng hợp này với mã nguồn tiền xử lý.

Làm thế nào gcc biết chia loại đặc biệt của file? Nó dựa vào đuôi mở rộng của file ở trên để xác định rõ phải xử lý file nhƣ thế nào cho dúng. Hầu hết những đuôi mở rộng thông thƣờng và chú thích của chúng đƣợc liệt kê trong bảng dƣới.

Phn mrng Kiu

.c Mã nguồn ngôn ngữ C

.c, .cpp Mã nguồn ngôn ngữ C++

.i Mã nguồn C tiền xử lý

.ii Mã nguồn C++ tiền xử lý

.S, .s Mã nguồn Hơp ngữ

.o Mã đối tƣợng biên dịch (obj)

.a, .so Mã thƣ viện biên dịch Các phần mở rộng của tên file đối với gcc

Liên kết file đối tƣợng, và cuối cùng tạo ra mã nhị phân:

$ gcc hello.o –o hello

Trong trƣờng hợp , ta chỉ muốn tạo ra các file obj, và nhƣ vậy thì bƣớc liên kết là không cần thiết.

Hầu hết các chƣơng trình C chứa nhiều file nguồn thì mỗi file nguồn đó đều phải đƣợc biên dịch sang mã obj trƣớc khi tới bƣớc liên kết cuối cùng. Giả sử có một ví dụ, ta đang làm việc trên killerapp.c là chƣơng trình sử dụng phần mã của helper.c, nhƣ vậy để biên dịch

killerapp.c ta phải dùng dòng lệnh sau:

$ gcc killerapp.c helper.c –o killerapp

gcc qua lần lƣợt các bƣớc tiền xử lý - biên dịch – liên kết, lúc này tạo ra các file obj cho mỗi file nguồn trƣớc khi tạo ra mã nhị phân cho killerapp.

Một số tuỳ chọn dòng lệnh của gcc:

-o FILE : Chỉ định tên file output; không cần thiết khi biên dịch sang mã obj. Nếu FILE không đƣợc chỉ rõ thì tên mặc định sẽ là a.out.

-c : Biên dịch không liên kết.

-DF00=BAR : Định nghĩa macro tiền xử lý đặt tên F00 với một giá trị của BAR trên dòng lệnh.

-IDIRNAME : Trƣớc khi chƣa quyết định đƣợc DIRNAME hãy tìm kiếm những file include trong danh sách các thƣ mục( tìm trong danh sách các đƣờng dẫn thƣ mục)

-LDIRNAME :Trƣớc khi chƣa quyết định đƣợc DIRNAME hãy tìm kiếm những file thƣ viện trong danh sách các thƣ mục. Với mặc định gcc liên kết dựa trên những thƣ viện dùng chung

- 80 -

-lF00 :Liên kết dựa trên libF00

-g :Bao gồm chuẩn gỡ rối thông tin mã nhị phân

-ggdb : Bao gồm tất cả thông tin mã nhị phân mà chỉ có chƣơng trình gỡ rối GNU- gdb mới có thể hiểu đƣợc

-O :Tối ƣu hoá mã biên dịch

-ON :Chỉ định một mức tối ƣu hoá mã N, 0<=N<=3.

-ANSI : Hỗ trợ chuẩn ANSI/ISO của C, loại bỏ những mở rộng của GNU mà xung đột với chuẩn( tuỳ chọn này không bảo đảm mã theo ANSI).

-pedantic :Cho ra tất cả những cảnh báo quy định bởi chuẩn

-pedantic-erors :Thông báo ra tất cả các lỗi quy định bởi chuẩn ANSI / ISO của C.

-traditional : Hỗ trợ cho cú pháp ngôn ngữ C của Kernighan và Ritchie (giống nhƣ cú pháp định nghĩa hàm kiểu cũ).

-w :Chặn tất cả thông điệp cảnh báo.

-Wall : Thông báo ra tất cả những cảnh báo hữu ích thông thƣờng mà gcc có thể cung cấp.

-werror : Chuyển đổi tất cả những cảnh báo sang lỗi mà sẽ làm ngƣng tiến trình biên dịch.

-MM :Cho ra một danh sách sự phụ thuộc tƣơng thích đƣợc tạo.

-v :Hiện ra tất cả các lệnh đã sử dụng trong mỗi bƣớc của tiến trình biên dịch.

Một phần của tài liệu Quan-tri-mang-nuy-vn-17308_-_He_dieu_hanh_ma_nguon_mo.pdf (Trang 79 - 81)