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

2024-06-26 03:39:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Windows10上使用Eclipse。Cython使用setup.py程序以常见方式将用PyDev编写的HelloWorld.pyx测试程序转换为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(AARC32)体系结构”的工具链,并选择了arm926ej-s Arm系列(-mcpu),这是我的目标核心。如果我现在尝试在Eclipse中构建该项目,我会收到一些致命错误,如“没有这样的文件或目录”对于许多头文件,包括“io.h”、“Python.h”和“pyconfig.h”

我从https://www.python.org/downloads/release/python-390/下载了Python3.9.0的“gzip源代码tarball”,将其解包,并将Python3.9.0\Include添加到Arm交叉编译器的Include路径(-I)中,用于“Python.h”,Python3.9.0\PC用于“pyconfig.h”,Python\3.9.0\Modules\u 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位的定义来看,似乎有些问题

为了解决这个问题,我使用以下configure命令行在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嵌入式处理器交叉编译的不同方法的提示,我会非常高兴


Tags: frommodulesincludedownloadserrorusersmpdfile