Настройка среды кросс-компиляции для конкретной целевой платформы
Я хотел бы настроить среду кросс-компиляции на Ubuntu 9.10. Из документов, которые я читал до сих пор (например, эти) , речь идет о компиляции цепочки инструментов целевых платформ.
Мой вопрос: как вы определяете требуемую версию каждого из пакетов в наборе инструментов для конкретной целевой платформы? Есть ли эмпирическое правило, которому я могу следовать?
Этот список можно найти на одном из сайтов, ссылки на которые приведены выше:
Binutils-2.16.1.tar.bz2
линукс-2.6.20.1.tar.bz2
Glibc-2.5.tar.bz2
GlibC-LinuxThreads-2.5.tar.bz2
НКА-ядро-4.2.0.tar.bz2
GCC-г ++-4.2.0.tar.bz2
Но предположим, что я хочу сгенерировать исполняемые файлы для стандартных коробок Ubuntu 8.04 и CentOS 5.3. Каковы необходимые пакеты?
Моя основная задача - избежать ошибок типа "/usr/lib/libstdc++.so.6: версия`GLIBCXX_3.4.11'не найдена "на машинах клиентов, но в будущем я хочу работать и с другими архитектурами.
4 ответа
Обычно хорошей идеей является создание кросс-цепочки инструментов, которая использует ту же версию libc (и других библиотек), что и в целевой системе. Это особенно важно в случае библиотек, которые используют версионные символы, или вы можете столкнуться с ошибками типа "/usr/lib/libstdc++.so.6: версия 'GLIBCXX_3.4.11' not found".
Та же архитектура
Для создания исполняемых файлов для стандартных систем Ubuntu 8.04 и CentOS 5.3 вы можете установить дистрибутивы на виртуальных машинах и выполнить необходимую компиляцию из виртуальной машины, чтобы гарантировать, что полученные двоичные файлы совместимы с версиями библиотек из каждого дистрибутива.
Другой вариант - настроить среды сборки chroot вместо виртуальных машин для целевых дистрибутивов.
Вы также можете создавать наборы инструментов, предназначенные для разных сред (разных версий библиотек), и собирать их в своей среде Ubuntu 9.10 без использования виртуальных машин или сред chroot. Я использовал кросс-инструмент Дэна Кегеля для создания таких кросс-цепочек.
Разная архитектура
Как я отметил в своем ответе на другой вопрос о кросс-компиляторе, я использовал кросс-инструмент Дэна Кегеля для создания кросс-цепочки для моих рук.
Похоже, что он может быть немного устаревшим, но есть матрица результатов сборки для различных архитектур, чтобы помочь определить подходящую комбинацию заголовков ядра gcc, glibc, binutils и linux.
Требуемые версии пакета
По моему опыту, на самом деле нет большого правила. Не все комбинации заголовков gcc, binutils, glibc и linux будут скомпилированы успешно. Даже если сборка завершается, для проверки успешности сборки необходим некоторый уровень тестирования. Иногда это делается путем компиляции ядра Linux с вашим новым кросс-инструментарием. В зависимости от целевой системы и архитектуры, для создания успешной сборки может потребоваться некоторое исправление исходного кода.
Поскольку вы настраиваете эту среду кросс-компиляции в Ubuntu 9.10, вы можете захотеть взглянуть на пакет dpkg-cross.
Компилировать для других дистрибутивов Linux проще всего, установив их на виртуальных машинах (apt-get install kvm), а затем выполнив компиляцию изнутри. Вы также можете написать их, чтобы сделать это автоматически. Создание кросс-компилятора и предоставление одинаковых версий всех библиотек и тому подобное, как это делают другие дистрибутивы Linux, практически невозможно.
Мой вопрос: как вы определяете требуемую версию каждого из пакетов в наборе инструментов для конкретной целевой платформы? ... binutils-2.16.1.tar.bz2 gcc-core-4.2.0.tar.bz2 gcc-g++-4.2.0.tar.bz2
Обычно выбирайте последнюю стабильную версию: они влияют только на ваш локальный набор инструментов, а не на время выполнения.
линукс-2.6.20.1.tar.bz2
Тебе это не нужно. (Для таргетинга на встроенные платформы вы можете использовать его.)
glibc-2.5.tar.bz2 glibc-linuxthreads-2.5.tar.bz2
Вам это не нужно. Т.е. вам не следует их скачивать или собирать; Вы должны ссылаться на версии из самого старого дистрибутива, который вы хотите поддерживать.
Есть ли эмпирическое правило, которому я могу следовать? Но предположим, что я хочу сгенерировать исполняемые файлы для стандартных коробок Ubuntu 8.04 и CentOS 5.3. Каковы необходимые пакеты?
Вы просматриваете дистрибутивы, на которые хотите ориентироваться, находите версии libc, libstdC++, pthreads и любой другой разделяемой библиотеки с наименьшим общим знаменателем, с которыми будете связываться, затем копируете эти библиотеки и соответствующие заголовки из коробки с этими версиями LCD на свой Набор инструментов. [править] Я должен уточнить, вы действительно хотите получить все зависимые библиотеки из одной системы. Выбор и выбор ЖК-дисплея каждой версии файла из разных дистрибутивов - это рецепт быстрого путешествия в ад зависимости.
В зависимости от ваших целевых платформ, вы рассматривали возможность использования Optware?
В настоящее время я работаю над созданием Mono и Moonlight для моего Palm Pre с использованием набора инструментов кросс-компиляции (а файлы сборки Optware уже обрабатывают большинство зависимостей).