LinuxでRustプロジェクトをビルド時の「error: linker cc not found」を修正する

beginner🦀 Rust2026-05-06| Linux(Ubuntu、Debian、Fedora、Arch、CentOS/RHEL)、Rust/Cargo 全バージョン、主に新規インストールや最小構成のコンテナ環境

Error Message

error: linker 'cc' not found
#rust#cargo#リンカー#linux

TL;DR クイックフィックス

gcc(またはお使いのディストリビューションのCツールチェーン)をインストールしてください。Cargoはネイティブバイナリをビルドするためにシステムリンカーが必要です — ccgccまたは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を導入することでgccmake、および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

Related Error Notes