Avatar ·

Ошибка "linker 'cc' not found" при компиляции Rust на Debian в WSL на Windows 10

Привет, коллеги! Я новичок в Rust и использую Windows 10 с установленной подсистемой WSL (Debian). Когда я пытаюсь скомпилировать простейшую программу, получаю ошибку. Вот мой код (файл main.rs): ```rust fn main() { println!("Hello, world!"); } ``` Я запускаю `rustc main.rs` или `cargo build` в терминале WSL (Debian), и получаю сообщение: ``` error: linker `cc` not found | = note: No such file or directory (os error 2) ``` Rust установлен через `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`, всё прошло успешно. Версия `rustc --version` показывает 1.70.0. Но компилятор не может найти линкер. Я уже гуглил, но большинство советов для чистого Linux, а не для WSL. Пробовал `sudo apt update && sudo apt install build-essential` — не помогло. Может быть, это из-за того, что WSL не видит установленные в Windows инструменты? Или нужно что-то дополнительно настраивать в самом Rust? Пожалуйста, подскажите, как исправить эту ошибку именно для Debian в WSL на Windows 10. Заранее спасибо! <<>>

Причина ошибки

Ошибка linker 'cc' not found возникает, потому что компилятор Rust (rustc) не может найти системный линкер, который отвечает за сборку итогового исполняемого файла из объектных файлов. В Linux по умолчанию используется линкер из пакета GCC (обычно это cc или gcc). В WSL (Debian) эта утилита отсутствует, если не установлены инструменты для разработки.

Ваша попытка установить build-essential — правильная, но возможно, что-то пошло не так. Давайте разберём пошаговое решение.

Шаг 1. Полная установка build-essential

Выполните в терминале WSL (Debian):

sudo apt update
sudo apt upgrade -y
sudo apt install build-essential -y

Пакет build-essential включает в себя GCC, G++, make и, самое главное, линкер ld и симлинк cc → gcc.

После установки проверьте, что линкер доступен:

which cc
# Должно вывести: /usr/bin/cc

Если команда cc не найдена, проверьте gcc:

gcc --version

Если GCC установлен, но cc отсутствует, создайте симлинк вручную:

sudo ln -s /usr/bin/gcc /usr/bin/cc

Шаг 2. Проверка переменной PATH

Убедитесь, что /usr/bin находится в вашем PATH. Выполните:

echo $PATH

Если /usr/bin отсутствует, добавьте его в ~/.bashrc:

echo 'export PATH="/usr/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

Шаг 3. Альтернатива — использование LLD (LLVM линкер)

Если по каким-то причинам GCC не подходит (например, вы хотите более быстрый линкер), установите lld:

sudo apt install lld -y

Затем настройте Rust использовать его:

# Временная настройка для одной компиляции
RUSTFLAGS="-C link-arg=-fuse-ld=lld" cargo build

# Постоянная настройка через ~/.cargo/config.toml
mkdir -p ~/.cargo
cat >> ~/.cargo/config.toml << EOF
[target.x86_64-unknown-linux-gnu]
rustflags = ["-C", "link-arg=-fuse-ld=lld"]
EOF

Шаг 4. Проверка после исправления

Теперь создайте новый проект и скомпилируйте его:

cargo new hello_world
cd hello_world
cargo build

Если всё прошло успешно, вы увидите:

   Compiling hello_world v0.1.0 (/home/user/hello_world)
    Finished dev [unoptimized + debuginfo] target(s) in 0.5s

Дополнительные советы для WSL

  • Не смешивайте Windows и WSL инструменты: Rust, установленный в WSL, должен использовать линкеры из WSL, а не из Windows. Убедитесь, что в вашем PATH нет путей к Windows-программам, которые могут конфликтовать.
  • Если вы используете VS Code: откройте терминал внутри WSL (команда wsl в терминале VS Code или расширение Remote - WSL).
  • Обновите Rust: rustup update — иногда старые версии rustc имеют проблемы с поиском линкера.

После этих шагов ошибка linker 'cc' not found должна исчезнуть. Если проблема остаётся, проверьте логи компиляции с флагом -v:

rustc -v main.rs 2>&1 | grep linker

Это покажет, какой именно линкер пытается вызвать rustc.

<<>>

Использование musl-tools как альтернативы

Если вы не хотите устанавливать весь GCC (он довольно тяжёлый), можно использовать статический линкер musl. Это особенно полезно, если вы собираетесь создавать статически скомпонованные бинарники для Linux.

Установите musl-tools:

sudo apt update
sudo apt install musl-tools -y

Теперь настройте Rust использовать musl-линкер. Добавьте в ~/.cargo/config.toml:

[target.x86_64-unknown-linux-musl]
linker = "musl-gcc"

При компиляции указывайте этот таргет:

cargo build --target x86_64-unknown-linux-musl

Преимущества этого подхода:

  • Меньший размер устанавливаемых пакетов (~10 MB вместо ~150 MB для build-essential).
  • Получаете статически скомпонованный бинарник, который можно запускать на любом Linux без зависимостей.
  • Не нужно создавать симлинк cc — musl-gcc сам является линкером.

Недостаток: статическая линковка может увеличить размер итогового файла, но для простых программ это не критично. Если вы работаете с большими проектами, лучше вернуться к стандартному GCC.