TL;DR クイックフィックス
gcc(またはお使いのディストリビューションのCツールチェーン)をインストールしてください。Cargoはネイティブバイナリをビルドするためにシステムリンカーが必要です — ccはgccまたはclangへのシンボリックリンクに過ぎず、セットアップしたばかりのシステムにはどちらも存在しません。
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
cargo buildを再実行すれば完了です。
実際に何が起きているのか
Rustは自前でリンクを行いません。コードをオブジェクトファイル(.o)にコンパイルし、それをシステムリンカーに渡します — CargoはこのリンカーをCC経由でccとして呼び出します。Linux上では、ccは通常インストールされているgccまたはclangへのシンボリックリンクです。
サーバーのセットアップ直後、CIランナー、最小限のDockerイメージでは、不要なものはすべて削除されています。rustupはRustを問題なくインストールしますが、Cargoがリンクしようとした瞬間にPATH上でccを探し、何も見つかりません。
エラーの全体像はこのようになります:
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
修正方法
オプション1:フルビルドツールチェーンをインストールする(推奨)
Ubuntu/Debianでは、build-essentialを導入することでgcc、make、およびC標準ライブラリヘッダーを一括でインストールできます。開発マシンでも本番ビルド環境でも、Rustプロジェクトに必要なものがすべて揃います。
# Ubuntu/Debian
sudo apt update && sudo apt install -y build-essential
# ccが使用可能になったことを確認
which cc
# /usr/bin/cc
オプション2:gccのみをインストールする(最小限の環境向け)
Dockerレイヤーを軽量化したい場合は、gccだけを直接インストールしてください:
# Debian slimイメージ
apt-get install -y gcc
# Alpine
apk add gcc musl-dev
Alpineはglibcの代わりにmuslを使用しているため、musl-devも必要です — C標準ライブラリのヘッダーはそちらに含まれています。省略すると、その後の処理で別のリンカーエラーが発生します。
オプション3:完全静的バイナリのためにmuslターゲットを使用する
共有ライブラリへの依存がゼロで、あらゆるLinux環境で動作するバイナリが必要ですか?muslターゲットは完全静的な実行可能ファイルを生成します — scratchコンテナやdistrolessコンテナに最適です。
# muslターゲットを追加
rustup target add x86_64-unknown-linux-musl
# muslツールチェーンをインストール(Ubuntu/Debian)
sudo apt install musl-tools
# ビルド
cargo build --release --target x86_64-unknown-linux-musl
出力はtarget/x86_64-unknown-linux-musl/release/に配置されます。AlpineまたはScratchコンテナにコピーすれば、ホスト上にlibcがなくても動作します。
オプション4:gccの代わりにclangを使用するようCargoに指定する
gccではなくclangがインストールされている場合は、.cargo/config.tomlでCargoに指定してください:
# .cargo/config.toml(プロジェクトレベル)
[target.x86_64-unknown-linux-gnu]
linker = "clang"
または、設定ファイルを使わずにビルドごとに指定することもできます:
CC=clang cargo build
Dockerfileの例(修正前と修正後)
このエラーが最もよく発生する場面でしょう。公式のrust:slimイメージはイメージサイズを削減するためにgccを省いています — しかしそれはリンク処理ができないことも意味します。
# 壊れている例:rust:slimにはgccが含まれていない
FROM rust:1.78-slim
WORKDIR /app
COPY . .
RUN cargo build --release # 失敗:linker 'cc' not found
クイックフィックス — ビルドステップの前にgccをインストールします:
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
さらに良い方法として、マルチステージビルドを使用することをお勧めします。フルサイズのrust:latestイメージでコンパイルし、バイナリだけをスリムなランタイムイメージにコピーします:
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"]
最終的なイメージは1GB以上ではなく、80〜100MB程度に収まります。本番環境にgccは不要で、不必要な攻撃面もありません。
確認方法
修正が成功したことを確認するための3つの簡単なチェック:
# 1. ccが存在することを確認
which cc && cc --version
# 2. プロジェクトをビルド
cargo build
# 3. またはリリースビルド
cargo build --release
正常な出力はこのようになります:
Compiling your-crate v0.1.0 (/app)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.42s
リンカーエラーが出なければ成功です。
ディストリビューション別クイックリファレンス
- 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

