我在 Windows 10 上使用 Eclipse。用 PyDev 编写的 HelloWorld.pyx 测试程序由 Cython 使用 setup.py 程序以常用方式转换为 HelloWorld.c。
from setuptools import setup
from Cython.Build import cythonize
setup (
name='HelloWorldCython',
ext_modules=cythonize('HelloWorld.pyx'),
zip_safe=False
)
生成的 HelloWorld.c 包含许多 python 头文件。
在 Eclipse 项目中,我使用“xPack GNU Arm Embedded GCC (arm-none-eabi-gcc)”作为“ARM (AArch32) 架构的工具链,并选择了 arm926ej-s Arm 系列 (-mcpu),这是我的目标核心. 如果我现在尝试在 Eclipse 中构建项目,我会收到一些致命错误,包括“io.h”、“Python.h”和“pyconfig.h”在内的一些头文件说“没有这样的文件或目录” .
我从https://www.python.org/downloads/release/python-390/下载了 Python 3.9.0 的“Gzipped source tarball”并将其解压缩并将 Python3.9.0\Include 添加到 Arm Cross Compiler 包含路径(- I) 用于“Python.h”,Python3.9.0\PC 用于“pyconfig.h”,Python\3.9.0\Modules_decimal\libmpdec 用于“io.h”。现在我得到了无穷无尽的错误,从这个开始:
make all
'Building file: ../helloworldCython.c'
'Invoking: GNU Arm Cross C Compiler'
arm-none-eabi-gcc -mcpu=arm926ej-s -mthumb -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -g3 -I"C:\Users\jonas\Downloads\xxx\Python-3.9.0\Include" -I"C:\Users\jonas\Downloads\xxx\Python-3.9.0\Modules\_decimal\libmpdec" -I"C:\Users\jonas\Downloads\xxx\Python-3.9.0\PC" -std=gnu11 -MMD -MP -MF"helloworldCython.d" -MT"helloworldCython.o" -c -o "helloworldCython.o" "../helloworldCython.c"
In file included from C:\Users\jonas\Downloads\xxx\Python-3.9.0\Modules\_decimal\libmpdec/io.h:33,
from C:\Users\jonas\Downloads\xxx\Python-3.9.0\PC/pyconfig.h:59,
from C:\Users\jonas\Downloads\xxx\Python-3.9.0\Include/Python.h:8,
from ../helloworldCython.c:18:
C:\Users\jonas\Downloads\xxx\Python-3.9.0\Modules\_decimal\libmpdec/mpdecimal.h:213:4: error: #error "define CONFIG_64 or CONFIG_32"
213 | #error "define CONFIG_64 or CONFIG_32"
| ^~~~~
C:\Users\jonas\Downloads\xxx\Python-3.9.0\Modules\_decimal\libmpdec/mpdecimal.h:247:5: error: unknown type name 'mpd_ssize_t'
247 | mpd_ssize_t prec; /* precision */
| ^~~~~~~~~~~
C:\Users\jonas\Downloads\xxx\Python-3.9.0\Modules\_decimal\libmpdec/mpdecimal.h:248:5: error: unknown type name 'mpd_ssize_t'
248 | mpd_ssize_t emax; /* max positive exp */
| ^~~~~~~~~~~
C:\Users\jonas\Downloads\xxx\Python-3.9.0\Modules\_decimal\libmpdec/mpdecimal.h:249:5: error: unknown type name 'mpd_ssize_t'
249 | mpd_ssize_t emin; /* min negative exp */
| ^~~~~~~~~~~
...等等(134个错误)。就 64 位或 32 位定义而言,似乎有些问题。
为了解决这个问题,我使用以下配置命令行在 Python3.9.0 源代码上运行 ./configure:
./configure --prefix=/jonas/eclipse-workspace/PythonARM9_2 --exec-prefix=/jonas/eclipse-workspace/PythonARM9_2/ARMPREFIX --with-universal-archs=32-bit --target=arm-noneeabi-gcc ac_cv_pthread_is_default=yes --disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no
这将创建一个新的“pyconfig.h”,我将 Eclipse 项目中的旧“pyconfig.h”替换为新的。
当我现在尝试构建项目时,我得到:
12:01:20 **** Incremental Build of configuration Debug for project pyCtest2 ****
make all
'Building file: ../helloworldCython.c'
'Invoking: GNU Arm Cross C Compiler'
arm-none-eabi-gcc -mcpu=arm926ej-s -mthumb -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -g3 -I"C:\Users\jonas\Downloads\xxx\Python-3.9.0\Include" -I"C:\Users\jonas\Downloads\xxx\Python-3.9.0\Modules\_decimal\libmpdec" -I"C:\Users\jonas\Downloads\xxx\Python-3.9.0" -std=gnu11 -MMD -MP -MF"helloworldCython.d" -MT"helloworldCython.o" -c -o "helloworldCython.o" "../helloworldCython.c"
In file included from C:\Users\jonas\Downloads\xxx\Python-3.9.0\Include/Python.h:8,
from ../helloworldCython.c:18:
C:\Users\jonas\Downloads\xxx\Python-3.9.0/pyconfig.h:1656:15: error: two or more data types in declaration specifiers
1656 | #define uid_t int
| ^~~
C:\Users\jonas\Downloads\xxx\Python-3.9.0/pyconfig.h:1635:15: error: two or more data types in declaration specifiers
1635 | #define gid_t int
| ^~~
In file included from C:\Users\jonas\Downloads\xxx\Python-3.9.0\Include/Python.h:136,
from ../helloworldCython.c:18:
C:\Users\jonas\Downloads\xxx\Python-3.9.0\Include/pythread.h:136:5: error: #error "Require native threads. See https://bugs.python.org/issue31370"
136 | # error "Require native threads. See https://bugs.python.org/issue31370"
| ^~~~~
C:\Users\jonas\Downloads\xxx\Python-3.9.0\Include/pythread.h:145:5: error: unknown type name 'NATIVE_TSS_KEY_T'
145 | NATIVE_TSS_KEY_T _key;
| ^~~~~~~~~~~~~~~~
make: *** [helloworldCython.o] Fehler 1
"make all" terminated with exit code 2. Build might be incomplete.
12:01:20 Build Failed. 5 errors, 0 warnings. (took 530ms)
我知道这可能不是很多人想要实现的目标。我对这个话题很陌生,如果有人发现这种方法有错误,或者可以给我提示将 Python 代码转换为 C 并为 ARM926ej-s 嵌入式处理器交叉编译它的不同方法,我会非常高兴。