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.
Phần mở rộng
Kiểu
.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.