Кросс-компиляция Makefile: работа с тестовыми программами - PullRequest
1 голос
/ 31 марта 2011

Я пытаюсь кросс-компилировать несколько библиотек от OSX до iOS.Я успешно скомпилировал libjpeg и libogg.

Но я не могу скомпилировать libvorbis, потому что configure настаивает на создании и запуске небольшой тестовой программы.Это, очевидно, не удается, поскольку он создает двоичный файл armv7, не запускает его, а затем интерпретирует его как отсутствующие библиотеки ogg.

Как вы обычно решаете проблему такого рода?Я испытываю желание взломать скрипт configure, чтобы обойти эти проблемы, но из-за такого рода сбоев некоторые функции могут быть отключены.Я также подумываю о том, чтобы позволить configure сгенерировать собственный Makefile и затем преобразовать его для использования инструментария iOS, но это кажется слишком подверженным ошибкам.

Любой совет?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Если вы кросс-компилируете что-либо, что имеет больше зависимостей, чем libc (glibc), это становится намного сложнее. Вы должны уже кросс-компилировать все зависимости. А кросс-компиляторный инструментарий и все вспомогательные программы и скрипты должны знать, как найти эти зависимости (кросс-скомпилированные библиотеки и заголовки).

Вам необходимо иметь уже скомпилированный libogg (и его зависимости) и установить их в корневой каталог кросс-компиляции. Заголовки и библиотеки из вашей системы сборки нельзя использовать для системы хоста (arm7). Они должны храниться отдельно.

Кроме того, если вы хотите иметь совместно используемые библиотеки объектов (* .so), а не только статические библиотеки, тогда возникает целый ряд новых сложностей. Например, хотя кросс-компиляторный набор инструментов содержит кросс-скомпилированный libc как часть набора инструментов, вам все равно нужен libc для хост-системы. Для этого можно использовать libc, который является частью цепочки инструментов, но его структура отличается от структуры хоста. Иногда люди копируют и переупорядочивают файлы, но часто люди просто компилируют и устанавливают новый glibc для рута.

В любом случае, все, что нужно сказать, две ошибки, которые вы видите, потому что скрипт configure не может найти кросс-скомпилированную библиотеку libogg. Если вы этого еще не сделали, вам нужно сделать кросс-компиляцию libogg (и зависимостей) и установить их в целевой корень. Затем вам нужно указать скрипту configure, где ваши кросс-скомпилированные заголовки (да, заголовки зависят от архитектуры) и библиотеки находятся в целевом корне. Обычно используют CFLAGS, LDFLAGS, CXXFLAGS и т. Д. (НЕ --prefix), но могут быть и другие переменные окружения, которые вам нужно также установить, чтобы они влияли на такие вещи, как pkg-config и т. Д. После того, как вы построили каждую зависимость, вам нужно получить makefile для установки зависимости от рута. Обычно это делается с make DESTDIR=[root] install, но некоторые make-файлы имеют свой собственный механизм (или не имеют надлежащего альтернативного механизма установки).

Вам также может потребоваться переопределить некоторые проверки конфигурации (с использованием переменных среды), которые плохо написаны и не имеют хороших параметров кросс-компиляции по умолчанию. Эти переменные обычно начинаются с ac_cv _ *

Итак, основной процесс состоит в том, чтобы сделать это для нужных вам пакетов (в порядке зависимости):

export CFLAGS=-I[root]/usr/include LDFLAGS=-L[root]/usr/lib CXXFLAGS=-I[root]/usr/include
export ac_cv_[test1]=[yes|no] ac_cv_[test2]=[yes|no] ...
./configure --host=[arm7-blah-blah]
make
make DESTDIR=[root] install

Удачи. Как только вы почувствуете себя комфортно со стандартным кросс-компилированием, вы будете готовы принять настоящее черное искусство, канадский крест ; -)

1 голос
/ 28 апреля 2011

Я наконец понял это.Я обманул configure, явно связав его с ogg (LDFLAGS="/usr/local/ios/lib/libogg-armv7.a" ./configure ...), а затем удалил явную ссылку на библиотеку из созданного файла сборки.

...