GIÁO TRÌNH HỆ ĐIỀU HÀNH UNIX - LINUX - Trang 148

1
4

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 m rng

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.