Сбой модуля bz2 при сборке Python 3.7 - PullRequest
2 голосов
/ 29 мая 2019

Я пытаюсь кросс-компилировать Python 3.7 для Android.Я вижу в своем выводе, что bz2 в случае сбоя со следующей ошибкой

building '_bz2' extension
/home/dematic/SPE/python3-android/sdk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -isystem /home/dematic/SPE/python3-android/build/19c-22-aarch64-linux-androideabi-4.9/include -isystem /home/dematic/SPE/python3-android/build/19c-22-aarch64-linux-androideabi-4.9/include/openssl -no-integrated-as -I. -I./Include -target aarch64-none-linux-androideabi22 -target aarch64-none-linux-androideabi22 -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -fPIC -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include -I. -I/home/dematic/SPE/python3-android/src/Python-3.7.3/Include -I/home/dematic/SPE/python3-android/src/Python-3.7.3 -c /home/dematic/SPE/python3-android/src/Python-3.7.3/Modules/_bz2module.c -o build/temp.linux-aarch64-3.7/home/dematic/SPE/python3-android/src/Python-3.7.3/Modules/_bz2module.o
/home/dematic/SPE/python3-android/sdk/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -isystem /home/dematic/SPE/python3-android/build/19c-22-aarch64-linux-androideabi-4.9/include -isystem /home/dematic/SPE/python3-android/build/19c-22-aarch64-linux-androideabi-4.9/include/openssl -no-integrated-as -shared -target aarch64-none-linux-androideabi22 -fuse-ld=lld -L /home/dematic/SPE/python3-android/build/19c-22-aarch64-linux-androideabi-4.9/lib -target aarch64-none-linux-androideabi22 -fuse-ld=lld -L /home/dematic/SPE/python3-android/build/19c-22-aarch64-linux-androideabi-4.9/lib -target aarch64-none-linux-androideabi22 -fuse-ld=lld -L /home/dematic/SPE/python3-android/build/19c-22-aarch64-linux-androideabi-4.9/lib -fPIC -target aarch64-none-linux-androideabi22 build/temp.linux-aarch64-3.7/home/dematic/SPE/python3-android/src/Python-3.7.3/Modules/_bz2module.o -L. -L/home/dematic/SPE/python3-android/build/19c-22-aarch64-linux-androideabi-4.9/lib -lbz2 -lpython3.7m -o build/lib.linux-aarch64-3.7/_bz2.cpython-37m.so
ld.lld: error: /home/dematic/SPE/python3-android/build/19c-22-aarch64-linux-androideabi-4.9/lib/libbz2.a(bzlib.o) is incompatible with aarch64linux
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я собираю bzip2 1.0.6 без каких-либо проблем, но я предполагаю, что я не связываюсь с ним правильно или какой-либо другой проблемой.Есть ли какая-то другая архитектура, которую я должен строить?

Это проект, который я пытаюсь построить с https://github.com/GRRedWings/python3-android

1 Ответ

3 голосов
/ 29 мая 2019

Я пытаюсь скомпилировать 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 всегда добавляются, потому что это необходимо для компиляции.

...