2013-03-16 8 views
5

У меня есть установленный на нем малиновый PI с Emdebian и вы хотите перекрестно скомпилировать проекты.Сочетание существующих rootfs с пользовательской инструментальной цепочкой

Существует множество документации о том, как получить инструментальную цепочку и построить с ней простой проект. Я сам сумел построить toolchain с crosstool-ng и написал программу hello world, которая отлично работает.

То, что я не получаю, - это то, как обращаться с кросс-компиляцией более сложных проектов, таких как Qt, которые имеют зависимости от других библиотек. Давайте используем в качестве примера libdbus, так как это одна из зависимостей Qt.

Установленный Emdebian уже содержит libdbus.so, поэтому, естественно, я бы предпочел использовать это вместо перекрестной компиляции моего собственного libdbus.so, поскольку для компиляции всех зависимостей Qt потребуется много времени.

Для кросс-компиляции, есть две важные каталоги, насколько я понимаю:

  1. «постановка» каталог, в котором живут все установленные библиотеки и приложения. Сначала это копия каталога sysroot toolchain и заполняется большим количеством библиотек, поскольку они перекрестно скомпилированы.
  2. «rootfs» каталог, который эквивалентен тому, что находится на устройстве - по существу, копия промежуточного каталога без ненужных материалов, таких как документация и файлы заголовков. Насколько я понимаю, наилучшим подходом является копирование необходимых файлов из промежуточного каталога в rootfs.

Получение каталога rootfs прост, так как это может быть монтирование NFS с устройства. Но как мне получить промежуточную директорию для существующей установки Emdebian в PI? В промежуточном каталоге должны быть включены такие элементы, как заголовки dbus, которые не установлены на корневой папке.

Некоторые люди просто устанавливают заголовки dbus на устройстве, используя apt-get install libdbus-dev, а затем используйте rootfs в качестве промежуточного каталога. С этой установкой больше нет различий между корневыми файлами и стадией, при этом недостаток в том, что rootfs загрязнены заголовками, документацией и т. Д. Преимущество, конечно, в том, что это легко.

Каков наилучший способ получить заголовки dbus в моем промежуточном каталоге на моей главной машине? Каков обычный подход, который люди используют в этой ситуации?

В качестве побочного вопроса, почему подход получения инструментальной цепочки, компиляции программы и последующего копирования на целевую работу вообще? Инструментальная цепочка отправляет свои собственные версии libc, libstdC++ и т. Д., Не являются ли они несовместимыми с версиями, которые установлены на целевом компьютере? Особенно при создании пользовательской инструментальной цепочки, скомпилированной с помощью crosstool-ng?

(Обратите внимание, что я не спрашиваю, как скомпилировать Qt, я могу понять, что из себя. Мой вопрос является более общим, о подходе принять при объединении пользовательского набора инструментов с существующей установки/корневой файловой системы)

ответ

1

По моему опыту, вам не нужно компилировать свой dbus.Вы можете сделать это, как

Создание Debian кросс корневой файловой системы с помощью Debootstrap по https://wiki.debian.org/EmDebian/CrossDebootstrap
Создать свой КИО-компиляции набора инструментов по crosstool-нг, и убедитесь, что версия ядра и eglibc версии такие же, как корневой файловой системы, созданных 1-й ступени
Сборка QT на

CPPFLAGS=-I<rootfs>/usr/include \ 
LDFLAGS=-L<rootfs>/lib -L<rootfs>/usr/lib -Wl,-rpath-link,<rootfs>/lib,<rootfs>/usr/lib \ 
./configure <your options> 
make 

Установка интервала QT в каталог сценический

make install DESTDIR=<stage directory> 

Копирование СПОКОЙНЫХ зависимых библиотек из корневой файловой системы й e ваш справочник

Таким образом, вы можете видеть, что сценический каталог хранится минимум без загрязнения.

+0

Awesome, debootstrap - именно то, что я искал. Получил немного, чтобы работать на OpenSuSE, но, в конце концов, это прекрасно :) –