android - 构建 Python 3.7 时 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构建的项目
解决方案
我正在尝试为 Android 交叉编译 Python 3.7。我在输出中看到 bz2 如果失败并出现以下错误
Bzip2 生成文件不是为交叉编译而编写的。他们有效地忽略了用户的标志,如CFLAGS
和LDFLAGS
。makefiles 实际上吹走了用户的CFLAGS
并将其设置为CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)
. -target aarch64-none-linux-androideabi22
不使用您的标志。
有两个 Makefiles 在起作用。如果我没记错的话,它会调用一个Makefile
并构建静态库。第二个是Makefile-libbz2_so
,它构建共享对象。您需要修复遗漏并将修复应用于两个 makefile。
您可能应该使用修补过的 Bzip,例如bzip2-noloader。它尊重用户的CFLAGS
, CXXFLAGS
,LDFLAGS
等。感兴趣的签入是Commit 34d170f31106。
bzip2-noloader中的 makefile 配方类似于以下内容。它们保留了 Seward 的原始设置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 也是 Honor 的PREFIX
,DESTDIR
等。因此您也可以执行分阶段安装。
我正在构建 bzip2 1.0.6 没有任何问题...
您可能正在为 i686 或 x86_64 而不是 Aarch64 构建。直到链接时间问题才会浮出水面。如果有兴趣,您可以使用它objdump
来检查目标文件。
另请注意,makefile 是这样做的:
CC=gcc
AR=ar
RANLIB=ranlib
LDFLAGS=
您可能还需要调整这些变量分配。有时ar
并ranlib
使用不寻常的名称,例如ranlib-5.0
. 还要确保工具在路上。
7.2.3 GNU 编码标准中用于指定命令的变量详细介绍了编写 makefile 以避免此类问题的方法。简而言之,(1)CFLAGS
为用户离开(和朋友);(2)如果需要标志,则始终提供它。
GNU 编码标准以此为例:
CFLAGS = -g
ALL_CFLAGS = -I. $(CFLAGS)
.c.o:
$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
用户可以覆盖默认值CFLAGS
,-g
并且-I
总是添加,因为它是编译所需要的。
推荐阅读
- logging - 如何使用主机应用程序提供的日志适配器从基于 Akka 的库中进行日志记录?
- c - Arduino IDE 找不到我的库目录 - Windows10
- neo4j - Neo4j 的 Cypher 查询中面临的语法问题
- ios - 具有从相同协议继承的自定义数据模型的构建列表 (ForEach)
- pandas - df 中只有一个 nan 值的 Dropna
- android - 无法解析 findNavController()
- java - 在java中使用文本框合并2 docx
- hibernate - Hibernate 5 错误:java.lang.IllegalArgumentException:不是实体类 com.stockapi.application.model.OHLC
- c# - 当我调用执行此操作的函数时,静态列表未更新
- java - Wildfly 13.0.0.FINAL 是否支持 OpenJDK 8.0?