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

