有没有办法交叉编译由 Cython 为 ARM9 创建的 C 代码?

问题描述

我在 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 源代码 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 嵌入式处理器交叉编译的不同方法提示,我会非常高兴。>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)