Вступление: Первая встреча с «красным драконом»
Вы только начали изучать Rust. Скачали компилятор, написали свой первый hello.rs, запускаете cargo build... И тут терминал взрывается красным сообщением: «linker 'cc' not found». Знакомо? Если вы работаете на Windows 10, используя подсистему WSL с Debian, то эта ошибка — классический «привет» от мира системного программирования.
Не паникуйте. Это не баг Rust, это особенность настройки окружения. В этой статье мы не только раз и навсегда разберемся с этой проблемой, но и поговорим о том, как оптимизировать процесс сборки, чтобы ваш код компилировался быстрее. Ведь Rust славится своей производительностью, и мы должны дать компилятору лучшие инструменты для работы.
Почему возникает ошибка «linker 'cc' not found»?
Чтобы понять врага, нужно знать его в лицо. Rust — компилируемый язык. Когда вы пишете cargo build, компилятор rustc превращает ваш код в машинный. Но финальный этап — линковка (сборка объектных файлов в исполняемый). Эту работу делает внешняя программа — линковщик.
По умолчанию в Linux-системах (включая WSL Debian) Rust ищет линковщик cc. Это символическая ссылка, которая обычно ведет на gcc или clang. Если в вашей WSL-системе не установлен компилятор C (GCC или Clang), то ссылка cc отсутствует. Rust не знает, чем линковать ваш проект, и выдает фатальную ошибку.
Корень проблемы: WSL Debian — минимальная установка
Когда вы ставите WSL Debian из Microsoft Store, вы получаете голую систему. В ней нет ни GCC, ни Make, ни других инструментов разработчика. Rust не включает в себя C-линковщик — это зона ответственности системного окружения.
Способ №1: Быстрое решение (установка GCC)
Самый простой и правильный путь — установить стандартный набор инструментов для разработки на C. Откройте терминал WSL Debian и выполните:
sudo apt update
sudo apt install build-essential
Пакет build-essential — это мета-пакет, который тянет за собой gcc, g++, make и, самое главное, создает ссылку /usr/bin/cc. После установки проверьте:
which cc
# Должно показать: /usr/bin/cc
Теперь снова запустите cargo build — ошибка исчезнет. Rust нашел линковщик.
Почему это важно для производительности?
Используя стандартный GCC, вы получаете стабильный и оптимизированный линковщик. Rust будет собирать ваш проект с минимальными накладными расходами. Оптимизация начинается с правильного инструментария.
Способ №2: Точная настройка (установка Clang)
Если вы фанат LLVM и Clang (а Rust тоже использует LLVM под капотом), вы можете поставить его вместо GCC. Это может дать небольшой прирост скорости линковки на некоторых проектах.
sudo apt install clang lld
# Создаем ссылку вручную, если её нет
sudo ln -s /usr/bin/clang /usr/bin/cc
Проверка:
cc --version
# Должен показать Clang
Важно: LLD (LLVM Linker) часто работает быстрее классического GNU ld. Для больших Rust-проектов это может сократить время сборки на 10-20%. Установка Clang — это не просто фикс ошибки, это оптимизация производительности компиляции.
Способ №3: Обходной путь (указание линковщика вручную)
Бывают ситуации, когда вы не хотите ставить GCC или Clang (например, на продакшн-сервере с ограничениями). Вы можете явно указать Rust, какой линковщик использовать. Но учтите: без установленного линковщика этот способ не сработает.
Создайте файл ~/.cargo/config.toml (или /.cargo/config.toml для глобальной настройки):
[target.x86_64-unknown-linux-gnu]
linker = "/usr/bin/gcc"
Если вы используете Clang:
[target.x86_64-unknown-linux-gnu]
linker = "/usr/bin/clang"
Этот метод полезен, когда у вас несколько тулчейнов или вы тестируете разные линковщики для сравнения производительности.
Глубокая оптимизация: Ускоряем сборку Rust-проектов
Теперь, когда ошибка исправлена, поговорим о том, как сделать так, чтобы cargo build летал. Ведь оптимизация и производительность — это конек Rust.
1. Используйте LLD (LLVM Linker)
Если вы установили Clang (Способ №2), вы уже можете использовать LLD. Пропишите в config.toml:
[target.x86_64-unknown-linux-gnu]
linker = "/usr/bin/clang"
rustflags = ["-C", "link-arg=-fuse-ld=lld"]
LLD работает быстрее GNU ld в многопоточном режиме. Для проектов с сотнями зависимостей разница может быть в секундах.
2. Многопоточная сборка
Rust по умолчанию использует все ядра процессора. Но вы можете это контролировать. Установите переменную окружения:
export CARGO_BUILD_JOBS=4
Или добавьте в config.toml:
[build]
jobs = 4
Не ставьте значение больше, чем количество физических ядер — это приведет к проседанию производительности из-за переключения контекста.
3. Используйте sccache (кеш компиляции)
sccache — это распределенный кеш для Rust и C/C++. Если вы работаете над большим проектом или переключаетесь между ветками, он сохраняет результаты предыдущих сборок и ускоряет повторные компиляции в разы.
cargo install sccache
export RUSTC_WRAPPER=sccache
Добавьте это в ~/.bashrc для постоянного эффекта. Производительность вашей сборки может вырасти на 50-70% при повторных компиляциях.
4. Настройка оптимизаций в Cargo.toml
Для релизных сборок используйте флаги оптимизации. Добавьте в Cargo.toml вашего проекта:
[profile.release]
opt-level