Настройка среды кросс-компиляции для конкретной целевой платформы

Я хотел бы настроить среду кросс-компиляции на 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 уже обрабатывают большинство зависимостей).

Другие вопросы по тегам