Linux 6 мин чтения

Устранение типичных ошибок при сборке и установке программ на Debian (проблемы сборки и Homebrew-подобных систем)

Это руководство поможет вам диагностировать и устранить распространенные проблемы, возникающие при сборке или установке программного обеспечения на операционной системе Debian. Ошибки могут быть связаны с несовместимость

DebianLinuxHomebrewpkgxсборка пакетовошибки компиляцииTroubleshootingC++

Симптомы

  • error: 'std::set::contains' was not declared (или аналогичные ошибки C++17/20)
  • GLIBCXX_3.4.31 not found при запуске
  • error: cannot find section '.dynamic' от fix-patchelf
  • cargo:warning=cannot find -lssl в проектах Rust
  • error: SSL_get_peer_certificate undefined
  • CMake Error: Compatibility with CMake < 3.5 has been removed from CMake.
  • cannot create directory '/...': No such file or directory во время установки

Возможные причины

  • Проект скомпилирован с использованием более новой версии компилятора (например, Clang), но использует устаревшую библиотеку libstdc++, не предоставляющую требуемый API.
  • Сборка произведена с более новой версией libstdc++, а при выполнении доступна только старая версия.
  • Утилита fix-patchelf пытается обработать статически скомпилированные Go-бинарники, у которых отсутствует секция .dynamic.
  • Тестовая среда запускается в чистом окружении, и артефакты сборки не доступны по ожидаемым путям.
  • Неправильная настройка переменных окружения для поиска библиотек OpenSSL в проектах Rust.
  • Проект использует API OpenSSL 1.1, которые были переименованы в OpenSSL 3.0, и происходит конфликт версий.
  • Несоответствие требуемой минимальной версии CMake и версии, используемой для сборки.
  • Скрипт установки не создает целевую директорию перед копированием файлов.

Пошаговое решение

1

Шаг 1: Общая диагностика и проверка среды сборки

Перед тем как углубляться в специфические ошибки, выполните несколько базовых проверок. Часто проблемы возникают из-за отсутствия необходимых инструментов или неправильной конфигурации: 1. **Прочтите документацию проекта**: Изучите файлы `INSTALL` или `BUILDING.md` в исходном коде проекта. Там часто указываются необходимые инструменты сборки и специфические инструкции. 2. **Изучите опыт других упаковщиков**: Посмотрите, как этот проект собирают для других систем. Например, поищите рецепты в `nixpkgs/pkgs/.../<name>/default.nix` или `Homebrew/homebrew-core/Formula/<name>.rb`. Их флаги конфигурации и патчи могут подсказать, что действительно нужно проекту. 3. **Воспроизведите сборку вручную**: Если вы используете систему сборки, похожую на `brewkit` или `pkgx`, перейдите в директорию сборки (например, `cd ./builds/<pkg>/<pkg>+<platform>/`). Откройте скрипт сборки (например, `dev.pkgx.build.sh`), добавьте `set -x` для отладки и запускайте части скрипта вручную, чтобы точно определить место сбоя. 4. **Загрузите среду сборки**: Если возможно, загрузите переменные окружения CI в свою оболочку, чтобы исследовать проблему. Для `pkgx` это можно сделать, оставив только блок `export` в `dev.pkgx.build.sh` и выполнив `source dev.pkgx.build.sh`.

Команда
cd ./builds/<pkg>/<pkg>+<platform>/
# Отредактируйте dev.pkgx.build.sh для отладки или изоляции переменных окружения
# source dev.pkgx.build.sh
2

Шаг 2: Решение проблем с компиляцией C/C++ и Go

Эти языки часто сталкиваются с проблемами линковки и совместимости библиотек: * **Ошибка C++: 'std::set::contains' не объявлен (или GLIBCXX_3.4.31 not found)** Эта проблема возникает, когда проект скомпилирован Clang, но использует устаревшую `libstdc++`, не поддерживающую требуемые API (например, C++17/20), или при выполнении доступна более старая версия библиотеки. **Действие**: Убедитесь, что у вас установлены актуальные версии компиляторов и библиотек. На Debian это можно сделать, установив `build-essential` и, при необходимости, более новые версии GCC. Если проблема с `libstdc++` сохраняется, попробуйте явно указать компилятору пути к включаемым файлам более новой версии GCC. В некоторых случаях, особенно для самодостаточных инструментов, помогает статическая линковка стандартной библиотеки C++: * **Ошибка Go: 'cannot find section '.dynamic'' при использовании fix-patchelf** Статические Go-бинарники не имеют секции `.dynamic`, поэтому утилиты, предназначенные для работы с динамической линковкой, могут выдавать такую ошибку. **Действие**: Если вы используете систему сборки, подобную `brewkit`, и собираете чистые Go-бинарники, которые не имеют динамических зависимостей, вы можете безопасно отключить шаг `fix-patchelf` в конфигурации сборки: * **Ошибка Go: 'module not found' в тестовом шаге** Тестовая среда обычно запускается в чистом каталоге `$HOME`, без артефактов вашей сборки. **Действие**: Убедитесь, что в процессе сборки вы используете абсолютные пути или явно размещаете необходимые файлы в целевой директории установки (например, `{{prefix}}`), которая будет доступна в тестовом шаге.

Команда
# Для ошибок C++ (пример флагов, пути могут отличаться):
export CXXFLAGS="$CXXFLAGS -isystem /usr/lib/gcc/<архитектура>/<версия_gcc>/include/c++ -isystem /usr/lib/gcc/<архитектура>/<версия_gcc>/include/c++/<архитектура>"
# Или для статической линковки (добавьте к флагам линкера):
LDFLAGS="$LDFLAGS -static-libstdc++ -static-libgcc"

# Для ошибок Go с fix-patchelf (если ваша система сборки поддерживает такую конфигурацию):
# В конфигурации сборки (например, YAML-файл):
# build:
#   skip: fix-patchelf

# Для ошибок Go 'module not found':
# В скрипте сборки используйте абсолютные пути или копируйте в {{prefix}}
# cp my_module "{{prefix}}"/bin/
3

Шаг 3: Устранение проблем с Rust, CMake и директориями установки

Эти проблемы часто связаны с поиском зависимостей, совместимостью версий и правильной организацией файловой системы: * **Ошибка Rust: 'cargo:warning=cannot find -lssl' или 'error: SSL_get_peer_certificate undefined'** Эти ошибки указывают на проблемы с поиском или несовместимостью версий библиотеки OpenSSL. Часто проекты Rust используют несколько способов для поиска OpenSSL. **Действие**: Во-первых, убедитесь, что у вас установлен пакет разработки OpenSSL (на Debian это `libssl-dev`). Затем явно укажите пути к библиотекам OpenSSL через переменные окружения. Если проект использует `rust-toolchain.toml`, убедитесь, что вы устанавливаете правильную цепочку инструментов Rust с помощью `rustup`: * **Ошибка CMake: 'Compatibility with CMake < 3.5 has been removed from CMake.'** Эта ошибка возникает, когда проект требует старые политики совместимости CMake, которые были удалены в CMake 4.x. **Действие**: Вы можете обойти эту проблему, установив переменную окружения `CMAKE_POLICY_VERSION_MINIMUM`: * **Ошибка: 'cannot create directory '/...': No such file or directory' при установке** Некоторые системы сборки или скрипты установки не создают целевые директории автоматически. **Действие**: В скрипте установки или перед копированием файлов явно создайте необходимую директорию с помощью команды `mkdir -p`:

Команда
# Для ошибок Rust/OpenSSL:
# Установите пакет разработки OpenSSL:
sudo apt update && sudo apt install libssl-dev

# Укажите пути к OpenSSL (пример, пути могут отличаться):
export OPENSSL_DIR="/usr"
export OPENSSL_LIB_DIR="/usr/lib/x86_64-linux-gnu"
export OPENSSL_INCLUDE_DIR="/usr/include"
export OPENSSL_ROOT_DIR="/usr"
export PKG_CONFIG_PATH="/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH"

# Для установки цепочки инструментов Rust (если используется rust-toolchain.toml):
# rustup default "$(grep '^channel' $SRCROOT/rust-toolchain.toml | sed 's/channel = "//;s/"//')"

# Для ошибок CMake:
export CMAKE_POLICY_VERSION_MINIMUM='3.5'

# Для ошибок 'cannot create directory':
mkdir -p "{{prefix}}"
# Затем продолжайте установку, например:
# install -D my_binary "{{prefix}}"/bin/my_binary

При попытке собрать или установить программное обеспечение на Debian, особенно с использованием таких инструментов, как Homebrew (через Linuxbrew) или pkgx с его brewkit, можно столкнуться с различными ошибками. Эти проблемы часто связаны с несовместимостью версий библиотек, неправильной настройкой среды сборки или специфическими требованиями компиляторов и систем сборки. Это руководство предлагает пошаговые инструкции для диагностики и устранения наиболее распространенных ошибок.

Общая диагностика и подготовка

Прежде чем переходить к конкретным решениям, всегда начинайте с базовой проверки. Часто проблема кроется в отсутствии необходимых зависимостей или неверных инструкциях сборки. Ознакомьтесь с документацией проекта, изучите опыт других разработчиков и внимательно проверьте логи сборки. Воспроизведение сборки вручную в изолированной среде может помочь выявить точную причину сбоя.

Решение проблем с компиляцией C/C++ и Go

Проекты на C/C++ и Go часто сталкиваются с проблемами, связанными с версиями библиотек и особенностями линковки. Например, ошибки, связанные с libstdc++, могут указывать на несоответствие версий компилятора и используемой стандартной библиотеки. Для Go-бинарников характерны проблемы с утилитами, предназначенными для динамически линкуемых файлов, если бинарник является статическим. Важно правильно настроить переменные окружения и, при необходимости, адаптировать скрипты сборки.

Устранение проблем с Rust, CMake и директориями установки

Проблемы с проектами на Rust часто касаются поиска библиотек, таких как OpenSSL, и требуют точной настройки путей через переменные окружения. CMake, в свою очередь, может выдавать ошибки совместимости, если проект использует устаревшие политики, не поддерживаемые новой версией CMake. Наконец, простые ошибки типа ‘cannot create directory’ обычно указывают на то, что целевая директория для установки не была создана перед попыткой копирования файлов, что легко решается явным созданием директории.

Следуя этим шагам, вы сможете эффективно диагностировать и устранять большинство распространенных ошибок, возникающих при сборке и установке программного обеспечения на вашей системе Debian.

Источники

  1. en.wikipedia.org — проверено 30.05.2026
  2. en.wikipedia.org — проверено 30.05.2026
  3. en.wikipedia.org — проверено 30.05.2026
  4. github.com — проверено 30.05.2026
  5. github.com — проверено 30.05.2026