Bỏ qua điều hướng, tới nội dung chính
Học C
Bài 1.212 phút đọc

Cài đặt môi trường

Sau bài này bạn sẽ làm được

  • Cài được GCC, Clang, GDB và các công cụ phụ trợ
  • Cấu hình VS Code để build và debug bằng một phím
  • Kiểm chứng môi trường bằng một chương trình đo kích thước kiểu dữ liệu
  • Biết chọn môi trường phù hợp khi đang dùng Windows

Bạn cần ba thứ: một trình biên dịch, một editor, và một trình gỡ lỗi. Bài này hướng dẫn cài đủ cả ba, cấu hình VS Code để build bằng một phím, rồi kiểm chứng bằng một chương trình nhỏ.

#Chọn môi trường

Khóa học này lấy Linux làm môi trường chuẩn. Lý do không phải sở thích: từ Phần 13 trở đi bạn sẽ dùng liên tục các công cụ khảo sát nhị phân như readelf, objdump, strace, valgrind, perf. Chúng chỉ đầy đủ trên Linux.

Bạn đang dùngNên chọnGhi chú
LinuxDùng luônKhông cần làm gì thêm
WindowsWSL2 với UbuntuLà Linux thật, tích hợp tốt với VS Code
macOSCommand Line ToolsCó Clang sẵn, nhưng thiếu valgrind và một số công cụ
Máy yếu, không cài đượcMáy ảo hoặc dịch vụ trực tuyếnReplit, Compiler Explorer để thử nhanh

#Cài trình biên dịch

GCC là lựa chọn chính

GCC là trình biên dịch C phổ biến nhất, cũng là thứ dùng để build nhân Linux. Cài kèm luôn gdb để gỡ lỗi và valgrind để bắt lỗi bộ nhớ.

Ubuntu, Debian, Kali, WSL
sudo apt update
sudo apt install -y build-essential gdb valgrind
Các bản phân phối khác
# Fedora, RHEL
sudo dnf install -y gcc gdb make valgrind

# Arch
sudo pacman -S base-devel gdb valgrind

# macOS
xcode-select --install

Nên cài thêm Clang

Clang là trình biên dịch thứ hai, thông báo lỗi dễ đọc hơn GCC và có bộ sanitizer rất tốt. Code biên dịch sạch trên cả hai thường là code chất lượng, vì mỗi trình biên dịch bắt được những lỗi khác nhau.

sudo apt install -y clang clang-tidy clang-format

#Nếu bạn dùng Windows

Có ba đường, nhưng chúng không tương đương nhau. Khuyến nghị mạnh là WSL2.

CáchƯu điểmHạn chế
WSL2Là Linux thật, đủ mọi công cụ, VS Code kết nối trực tiếpCần Windows 10 phiên bản 2004 trở lên
MSYS2 hoặc MinGW-w64Chạy native trên Windows, có GCCThiếu valgrind, một số công cụ khảo sát khác biệt
MSVCTích hợp sẵn Visual StudioHỗ trợ chuẩn C rất chậm trễ, không khuyến nghị để học C

Cài WSL2 chỉ mất một lệnh, chạy trong PowerShell quyền quản trị:

PowerShell (Administrator)
wsl --install -d Ubuntu

#Editor và cấu hình

VS Code là lựa chọn khuyến nghị

Nhẹ, miễn phí, gỡ lỗi tốt, và kết nối thẳng vào WSL. Cài ba tiện ích mở rộng: C/C++ của Microsoft, Makefile Tools, và WSL nếu bạn đang ở Windows.

Tạo file .vscode/tasks.json để build bằng Ctrl Shift B:

.vscode/tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build",
      "type": "shell",
      "command": "gcc",
      "args": [
        "-std=c17", "-Wall", "-Wextra", "-Wpedantic", "-g",
        "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "group": { "kind": "build", "isDefault": true },
      "problemMatcher": ["$gcc"]
    }
  ]
}

.vscode/launch.json để gỡ lỗi bằng F5. Cấu hình này tự build trước khi chạy, nên bạn không bao giờ debug nhầm bản cũ:

.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "gdb debug",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "cwd": "${workspaceFolder}",
      "MIMode": "gdb",
      "preLaunchTask": "build"
    }
  ]
}

Code::Blocks cho hai tuần đầu

Nếu bạn hoàn toàn mới và thấy terminal đáng sợ, Code::Blocks là lựa chọn hợp lý: bản cài đặt đã kèm sẵn GCC, bấm một nút là chạy. Nhưng hãy chuyển sang VS Code kèm terminal sau khoảng hai tuần, vì từ Phần 2 trở đi bạn cần gõ lệnh trực tiếp.

#Kiểm chứng môi trường

Đừng tin là đã cài xong cho tới khi chạy được. Chương trình dưới đây vừa kiểm tra trình biên dịch, vừa cho bạn biết hai thông tin sẽ dùng lại nhiều lần về sau.

check.c
#include <stdio.h>

int main(void)
{
    printf("Trinh bien dich hoat dong\n");
    printf("Chuan C: %ld\n", __STDC_VERSION__);
    printf("Kich thuoc con tro: %zu byte, he thong %zu-bit\n",
           sizeof(void *), sizeof(void *) * 8);
    return 0;
}
Nếu chương trình này chạy được, môi trường của bạn đã sẵn sàng cho toàn bộ Phần 0 và Phần 1.
terminal
gcc -std=c17 -Wall -Wextra check.c -o check
./check
Trinh bien dich hoat dong
Chuan C: 201710
Kich thuoc con tro: 8 byte, he thong 64-bit

Giá trị 201710 nghĩa là trình biên dịch đang làm việc theo chuẩn C17. Con trỏ 8 byte nghĩa là hệ thống 64 bit. Hai con số này sẽ được giải thích kỹ ở Phần 1, bây giờ chỉ cần biết chúng xuất hiện là môi trường đã đúng.

#Vòng làm việc hằng ngày

Từ giờ tới hết khóa học, bạn sẽ lặp lại đúng bốn bước này. Càng quay vòng nhanh, càng học nhanh.

Mục tiêu là rút ngắn thời gian mỗi vòng xuống còn vài giây, chứ không phải viết đúng ngay lần đầu.
  1. Tạo thư mục làm việc

    mkdir -p ~/hoc-c/phan-0 && cd ~/hoc-c/phan-0
  2. Viết file nguồn

    Mỗi bài tập một file .c riêng, đặt tên có nghĩa. Đừng gộp nhiều bài vào một file.

  3. Biên dịch và chạy trong một dòng

    Dấu && đảm bảo chương trình chỉ chạy khi biên dịch thành công, nên bạn không bao giờ chạy nhầm bản cũ.

    gcc -std=c17 -Wall -Wextra -g bai.c -o bai && ./bai
  4. Đọc cảnh báo trước khi đọc kết quả

    Nếu trình biên dịch in ra bất cứ dòng cảnh báo nào, sửa nó trước đã. Phần lớn cảnh báo của C đều báo hiệu một lỗi thật đang chờ xảy ra.

Tự làm thử

  1. Cài đủ GCC, Clang, GDB rồi chạy gcc --version clang --version để xác nhận.
  2. Biên dịch check.c bằng cả GCC và Clang, so sánh kết quả in ra.
  3. Cấu hình VS Code với hai file trên, rồi thử build bằng Ctrl Shift B và debug bằng F5.
  4. Cố tình xóa một dấu chấm phẩy trong check.c rồi biên dịch. Đọc kỹ thông báo lỗi, ghi lại số dòng mà trình biên dịch báo.

Trình chấm điểm tự động sẽ được bổ sung ở giai đoạn sau. Hiện tại bạn tự chạy thử trên máy.

Tóm tắt

  • Môi trường chuẩn của khóa học là Linux hoặc WSL2, vì đầy đủ công cụ khảo sát nhị phân nhất.
  • Cài build-essential, gdb, valgrind, và nên có thêm Clang để đối chiếu.
  • Luôn biên dịch với -Wall -Wextra -Wpedantic -g. Cảnh báo được coi là lỗi.
  • VS Code cấu hình bằng tasks.json và launch.json cho phép build và debug bằng một phím.
  • Vòng làm việc gồm bốn bước: viết, biên dịch, chạy thử, đọc lỗi và sửa.