Я пытаюсь скомпилировать Python 3.7 для Android.Я вижу в своем выводе, что bz2 в случае сбоя со следующей ошибкой
make-файлы Bzip2 не написаны для кросс-компиляции.Они фактически игнорируют флаги пользователя, такие как CFLAGS
и LDFLAGS
.Makefiles фактически удаляет пользователя CFLAGS
и устанавливает его на CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)
.Ваши флаги, такие как -target aarch64-none-linux-androideabi22
, не используются.
В игре два Makefile.Один называется Makefile
, и, если я правильно помню, он создает статическую библиотеку.Второй - Makefile-libbz2_so
, и он создает общий объект.Вам нужно исправить пропуски и применить исправления к обоим make-файлам.
Возможно, вам следует использовать пропатченный Bzip, такой как bzip2-noloader .Он уважает пользователя CFLAGS
, CXXFLAGS
, LDFLAGS
и т. Д. Интересующая регистрация: Commit 34d170f31106 .
Рецепты make-файла в bzip2-noloader похоже на следующее.Они сохраняют исходные настройки Сьюарда в BZIP_CFLAGS
.Но они также используют CPPFLAGS
и допускают переопределение пользователем в CFLAGS
.Переопределение поднимет ваши флаги, такие как -target aarch64-none-linux-androideabi22
.
blocksort.o: blocksort.c
$(CC) $(CPPFLAGS) $(BZIP_CFLAGS) $(CFLAGS) -c blocksort.c
Программы используют LDFLAGS
как положено:
bzip2: libbz2.a bzip2.o
$(CC) $(CPPFLAGS) $(BZIP_CFLAGS) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2
Наконец, bzip2-noloader forkа также PREFIX
, DESTDIR
и т. д. Таким образом, вы также можете выполнять поэтапную установку.
Я собираю bzip2 1.0.6 без каких-либо проблем ...
Вы, вероятно, собираете для i686 или x86_64, а не для Aarch64.Проблема не появляется до времени ссылки.Вы можете использовать objdump
для проверки объектных файлов, если вы заинтересованы.
Также обратите внимание, что make-файл делает это:
CC=gcc
AR=ar
RANLIB=ranlib
LDFLAGS=
Возможно, вам также потребуется настроить эти переменные.,Иногда ar
и ranlib
используют необычные имена, такие как ranlib-5.0
.А также убедитесь, что инструменты находятся в пути.
Способ написания make-файлов во избежание подобных проблем подробно описан в 7.2.3 Переменные для указания команд в GNUСтандарты кодирования.Суть в том, что (1) оставить CFLAGS
(и друзей) для пользователя;и (2) , если требуется флаг, то всегда указывайте его.
Стандарты кодирования GNU используют это в качестве примера:
CFLAGS = -g
ALL_CFLAGS = -I. $(CFLAGS)
.c.o:
$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
Пользователи могут переопределитьпо умолчанию CFLAGS
из -g
и -I
всегда добавляются, потому что это необходимо для компиляции.