构建Python 3.7时bz2模块失败

时间:2019-05-28 21:44:56

标签: android python python-3.x android-ndk bz2

我正在尝试交叉编译适用于Android的Python 3.7。我在输出中看到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 个答案:

答案 0 :(得分:3)

  

我正在尝试交叉编译适用于Android的Python 3.7。我在输出中看到bz2如果失败并出现以下错误

Bzip2 makefile不能用于交叉编译。它们有效地忽略了用户的标志,例如CFLAGSLDFLAGS。生成文件实际上吹走了用户的CFLAGS并将其设置为CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)。您不会使用-target aarch64-none-linux-androideabi22之类的标志。

正在播放两个Makefile。如果我没记错的话,一个叫做Makefile,它会建立静态库。第二个是Makefile-libbz2_so,它建立共享对象。您需要修复遗漏并将修复程序应用于两个makefile。

您可能应该使用bzip2-noloader之类的修补Bzip。它尊重用户的CFLAGSCXXFLAGSLDFLAGS等。感兴趣的检入是Commit 34d170f31106

bzip2-noloader中的makefile配方类似于以下内容。它们在BZIP_CFLAGS中保留了Seward的原始设置。但是它们还利用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分支还会兑现PREFIXDESTDIR等。因此,您也可以执行分阶段安装。


  

我正在构建bzip2 1.0.6,没有任何问题...

您可能正在为i686或x86_64而非Aarch64进行构建。直到链接时间问题才浮出水面。如果有兴趣,可以使用objdump检查目标文件。


还要注意,makefile会这样做:

CC=gcc
AR=ar
RANLIB=ranlib
LDFLAGS=

您可能还需要调整这些变量分配。有时arranlib使用不寻常的名称,例如ranlib-5.0。还要确保这些工具在使用中。


在GNU编码标准中的7.2.3 Variables for Specifying Commands中详细介绍了为避免此类问题而编写makefile的方法。简而言之,是(1)将CFLAGS(和朋友)留给用户;和(2)如果需要一个标志,则始终提供它。

GNU编码标准以此为例:

CFLAGS = -g
ALL_CFLAGS = -I. $(CFLAGS)
.c.o:
    $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<

用户可以覆盖CFLAGS的默认-g,并且总是添加-I,因为编译需要它。