Lệnh gcc trong Linux

Giới thiệu

Trong lab này, bạn sẽ học cách sử dụng trình biên dịch GCC (GNU Compiler Collection) để biên dịch và tối ưu hóa các chương trình C trên hệ thống Linux. Bạn sẽ bắt đầu bằng cách hiểu những điều cơ bản về trình biên dịch GCC, bao gồm các tùy chọn dòng lệnh thông dụng. Sau đó, bạn sẽ biên dịch một chương trình C đơn giản và khám phá các cờ tối ưu hóa của GCC để cải thiện hiệu suất mã của bạn.

Lab bao gồm các bước sau:

  • Hiểu những điều cơ bản về trình biên dịch GCC
  • Biên dịch một chương trình C đơn giản với GCC
  • Khám phá các cờ tối ưu hóa của trình biên dịch GCC

Trình biên dịch GCC là một công cụ quan trọng để xây dựng các chương trình C và C++ trên Linux, và lab này sẽ cung cấp cho bạn các ví dụ thực tế để giúp bạn thành thạo hơn trong việc sử dụng nó.

Hiểu những điều cơ bản về trình biên dịch GCC

Trong bước này, bạn sẽ học những điều cơ bản về trình biên dịch GCC (GNU Compiler Collection), đây là một trình biên dịch được sử dụng rộng rãi cho C, C++ và các ngôn ngữ lập trình khác trên các hệ thống Linux.

Đầu tiên, hãy kiểm tra phiên bản GCC được cài đặt trong môi trường:

gcc --version

Ví dụ đầu ra:

gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Trình biên dịch GCC là một công cụ quan trọng để biên dịch và xây dựng các chương trình C và C++ trên Linux. Nó cung cấp nhiều tùy chọn và cờ khác nhau để kiểm soát quá trình biên dịch, tối ưu hóa mã được tạo và xử lý các khía cạnh khác nhau của quá trình xây dựng.

Một số tùy chọn dòng lệnh GCC thông dụng bao gồm:

  • -c: Biên dịch và hợp ngữ, nhưng không liên kết
  • -o <output>: Chỉ định tên tệp đầu ra
  • -g: Tạo thông tin gỡ lỗi
  • -Wall: Bật tất cả các thông báo cảnh báo
  • -Werror: Coi tất cả các cảnh báo là lỗi
  • -O<n>: Mức tối ưu hóa, trong đó n là 0, 1, 2, 3 hoặc s

Để hiểu rõ hơn về các tùy chọn này, chúng ta sẽ khám phá chúng trong các bước sau.

Biên dịch một chương trình C đơn giản với GCC

Trong bước này, bạn sẽ học cách biên dịch một chương trình C đơn giản bằng trình biên dịch GCC.

Đầu tiên, hãy tạo một thư mục mới cho dự án của chúng ta và điều hướng đến nó:

mkdir ~/project/simple-c-program
cd ~/project/simple-c-program

Bây giờ, hãy tạo một tệp mới có tên hello.c với nội dung sau:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

Đây là một chương trình C đơn giản in "Hello, World!" ra console.

Để biên dịch chương trình này bằng GCC, hãy chạy lệnh sau:

gcc -o hello hello.c

Lệnh này sẽ biên dịch tệp hello.c và tạo ra một tệp thực thi có tên hello.

Bây giờ bạn có thể chạy chương trình đã biên dịch:

./hello

Ví dụ đầu ra:

Hello, World!

Lệnh gcc được sử dụng ở trên có các tùy chọn sau:

  • -o hello: Chỉ định tên tệp đầu ra là hello
  • hello.c: Tệp nguồn C đầu vào để biên dịch

GCC cung cấp nhiều tùy chọn khác để kiểm soát quá trình biên dịch, mà chúng ta sẽ khám phá trong bước tiếp theo.

Khám phá các cờ tối ưu hóa của trình biên dịch GCC

Trong bước này, bạn sẽ tìm hiểu về các cờ tối ưu hóa khác nhau có sẵn trong trình biên dịch GCC và cách chúng có thể được sử dụng để cải thiện hiệu suất của các chương trình C của bạn.

Hãy bắt đầu bằng cách biên dịch chương trình hello.c mà chúng ta đã tạo ở bước trước với các mức tối ưu hóa khác nhau:

## Compile with no optimization
gcc -O0 -o hello_no_opt hello.c
./hello_no_opt

Ví dụ đầu ra:

Hello, World!
## Compile with optimization level 1 (default)
gcc -O1 -o hello_opt1 hello.c
./hello_opt1

Ví dụ đầu ra:

Hello, World!
## Compile with optimization level 2
gcc -O2 -o hello_opt2 hello.c
./hello_opt2

Ví dụ đầu ra:

Hello, World!
## Compile with optimization level 3 (aggressive)
gcc -O3 -o hello_opt3 hello.c
./hello_opt3

Ví dụ đầu ra:

Hello, World!

Các mức tối ưu hóa trong GCC là:

  • -O0: Không tối ưu hóa (mặc định khi không có mức tối ưu hóa nào được chỉ định)
  • -O1: Tối ưu hóa vừa phải, một sự cân bằng tốt giữa thời gian biên dịch và hiệu suất
  • -O2: Tối ưu hóa mạnh mẽ, tập trung vào hiệu suất
  • -O3: Tối ưu hóa thậm chí còn mạnh mẽ hơn, có thể dẫn đến kích thước mã lớn hơn và thời gian biên dịch lâu hơn

Ngoài các mức tối ưu hóa chung, GCC cũng cung cấp các cờ tối ưu hóa cụ thể hơn:

  • -Os: Tối ưu hóa cho kích thước, thay vì tốc độ
  • -Ofast: Bật các tối ưu hóa mạnh mẽ có thể vi phạm sự tuân thủ các tiêu chuẩn nghiêm ngặt

Điều quan trọng cần lưu ý là mặc dù mức tối ưu hóa cao hơn có thể cải thiện hiệu suất, nhưng chúng cũng có thể gây ra hành vi hoặc lỗi không mong muốn trong mã của bạn. Thông thường, bạn nên bắt đầu với mức tối ưu hóa thấp hơn, chẳng hạn như -O1, và tăng dần mức tối ưu hóa trong khi kiểm tra kỹ chương trình của bạn.

Tóm tắt

Trong lab này, trước tiên bạn đã học những điều cơ bản về trình biên dịch GCC (GNU Compiler Collection), bao gồm cách kiểm tra phiên bản đã cài đặt và các tùy chọn dòng lệnh thông dụng như -c, -o, -g, -Wall, -Werror-O<n>. Sau đó, bạn đã thực hành biên dịch một chương trình C đơn giản bằng lệnh gcc, học cách tạo tệp nguồn, biên dịch nó và chạy tệp thực thi kết quả. Cuối cùng, bạn đã khám phá các cờ tối ưu hóa của GCC, cho phép bạn kiểm soát mức độ tối ưu hóa mã trong quá trình biên dịch.

400+ câu lệnh phổ biến trong Linux