Sửa lỗi 'error: linker cc not found' khi build dự án Rust trên Linux

beginner🦀 Rust2026-05-06| Linux (Ubuntu, Debian, Fedora, Arch, CentOS/RHEL), Rust/Cargo mọi phiên bản, thường gặp trên cài đặt mới hoặc container tối giản

Error Message

error: linker 'cc' not found
#rust#cargo#linker#linux

Tóm tắt nhanh

Cài gcc (hoặc bộ công cụ C của distro bạn). Cargo cần một trình liên kết hệ thống để tạo ra các file nhị phân — cc chỉ là symlink đến gcc hoặc clang, và trên hệ thống mới cài thì cả hai đều chưa có.

Ubuntu / Debian

sudo apt update
sudo apt install build-essential

Fedora / RHEL / CentOS

sudo dnf groupinstall "Development Tools"

Arch Linux

sudo pacman -S base-devel

Alpine Linux (Docker)

apk add --no-cache gcc musl-dev

Chạy lại cargo build là xong.

Nguyên nhân thực sự

Rust không tự xử lý việc liên kết. Nó biên dịch code của bạn thành các file object (.o), rồi chuyển chúng sang trình liên kết hệ thống — được Cargo gọi thông qua cc. Trên Linux, cc thường là symlink đến gcc hoặc clang, tùy cái nào được cài.

Các server mới, CI runner, và Docker image tối giản đều loại bỏ mọi thứ không cần thiết. rustup cài Rust bình thường, nhưng ngay khi Cargo cố liên kết, nó tìm cc trong PATH và không thấy gì cả.

Toàn bộ thông báo lỗi trông như sau:

error: linker `cc` not found
  |
  = note: No such file or directory (os error 2)

error: could not compile `your-crate` (bin "your-crate") due to 1 previous error

Các cách khắc phục

Cách 1: Cài toàn bộ bộ công cụ build (khuyến nghị)

Trên Ubuntu/Debian, build-essential kéo về gcc, make, và các header thư viện chuẩn C chỉ trong một lệnh. Nó đáp ứng mọi thứ mà các dự án Rust thường cần, cả trên máy dev lẫn môi trường build production.

# Ubuntu/Debian
sudo apt update && sudo apt install -y build-essential

# Kiểm tra cc đã có chưa
which cc
# /usr/bin/cc

Cách 2: Chỉ cài gcc (môi trường tối giản)

Muốn giảm kích thước Docker layer? Cài thẳng gcc:

# Debian slim image
apt-get install -y gcc

# Alpine
apk add gcc musl-dev

Alpine dùng musl thay vì glibc, nên bạn cũng cần musl-dev — đó là nơi chứa các header thư viện chuẩn C. Đừng bỏ qua, không thì bạn sẽ gặp lỗi liên kết khác ở bước sau.

Cách 3: Dùng target musl để tạo binary tĩnh hoàn toàn

Muốn có binary chạy được trên bất kỳ máy Linux nào mà không phụ thuộc shared library? Target musl tạo ra các file thực thi hoàn toàn tĩnh — lý tưởng cho scratch hoặc distroless container.

# Thêm musl target
rustup target add x86_64-unknown-linux-musl

# Cài musl toolchain (Ubuntu/Debian)
sudo apt install musl-tools

# Build
cargo build --release --target x86_64-unknown-linux-musl

File output nằm ở target/x86_64-unknown-linux-musl/release/. Copy vào Alpine hoặc scratch container là chạy được mà không cần libc trên host.

Cách 4: Chỉ định Cargo dùng clang thay vì gcc

Đã cài clang nhưng chưa có gcc? Trỏ Cargo đến nó qua .cargo/config.toml:

# .cargo/config.toml (cấp độ project)
[target.x86_64-unknown-linux-gnu]
linker = "clang"

Hoặc bỏ qua file config và đặt cho từng lần build:

CC=clang cargo build

Ví dụ Dockerfile (Trước và Sau)

Đây có lẽ là nơi phổ biến nhất mà người ta gặp lỗi này. Image rust:slim chính thức bỏ gcc để giảm kích thước — nhưng điều đó cũng có nghĩa là nó không thể liên kết bất cứ thứ gì.

# LỖI: rust:slim không có gcc
FROM rust:1.78-slim
WORKDIR /app
COPY . .
RUN cargo build --release  # fails: linker 'cc' not found

Sửa nhanh — cài gcc trước bước build:

FROM rust:1.78-slim
WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    libc6-dev \
    && rm -rf /var/lib/apt/lists/*
COPY . .
RUN cargo build --release

Tốt hơn nữa, dùng multi-stage build. Biên dịch trong image rust:latest đầy đủ, rồi chỉ copy binary vào runtime slim:

FROM rust:1.78 AS builder
WORKDIR /app
COPY . .
RUN cargo build --release

FROM debian:bookworm-slim
COPY --from=builder /app/target/release/your-binary /usr/local/bin/
CMD ["your-binary"]

Image cuối cùng chỉ khoảng 80–100 MB thay vì hơn 1 GB. Không có gcc trong môi trường production, không có bề mặt tấn công không cần thiết.

Kiểm tra

Ba bước kiểm tra nhanh để xác nhận đã sửa thành công:

# 1. Xác nhận cc đã tồn tại
which cc && cc --version

# 2. Build project của bạn
cargo build

# 3. Hoặc build bản release
cargo build --release

Output sạch trông như thế này:

   Compiling your-crate v0.1.0 (/app)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.42s

Không còn lỗi liên kết là đã xong.

Tham khảo nhanh theo Distro

  • Ubuntu/Debian: sudo apt install build-essential
  • Fedora: sudo dnf groupinstall "Development Tools"
  • CentOS/RHEL 8+: sudo dnf install gcc
  • Arch: sudo pacman -S base-devel
  • Alpine: apk add gcc musl-dev
  • Void Linux: sudo xbps-install base-devel

Related Error Notes