无法将cython生成的C语言代码转换为可执行文件

时间:2019-05-05 18:36:19

标签: python c gcc cython

我正在使用Windows操作系统。我有Visual Studio和与其相关的所有构建工具。我有简单的python脚本。我用cython生成了一个“ C”文件。我正在尝试将此C文件转换为可执行文件。我不想使用其他任何模块,例如pyinstaller,py2exe或cxFreeze。

从.py到C的转换成功。但是可悲的是,在将此C文件转换为可执行文件时遇到了一些错误。

有人可以帮助我吗?我已经检查了有关此问题的其他各种问题,但都没有这个问题。

这是我的(.pyx脚本)

from tkinter import Tk

root = Tk()
root.mainloop()

我在CMD中使用以下命令为该脚本构建C扩展名:

python setup.py build_ext --inplace -DMS_WIN64

然后我在CMD中使用此命令来构建可执行文件:

gcc -DMS_WIN64 C:/Users/Siva/Desktop/Scripts/TEST/test.c -IC:/"Program Files"/Python37/include -LC:/"Program Files"/Python37/libs -lpython37 -o output

这会产生以下错误:

C:\Users\Siva\Desktop\Scripts\TEST>gcc -DMS_WIN64 C:/Users/Siva/Desktop/Scripts/TEST/test.c -IC:/"Program Files"/Python37/include -LC:/"Program Files"/Python37/libs -lpython37.a -o output
C:/Users/Siva/Desktop/Scripts/TEST/test.c:213:41: warning: division by zero [-Wdiv-by-zero]
     enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) };
                                         ^
C:/Users/Siva/Desktop/Scripts/TEST/test.c:213:12: error: enumerator value for '__pyx_check_sizeof_voidp' is not an integer constant
     enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) };
            ^~~~~~~~~~~~~~~~~~~~~~~~

我已附上以下错误的屏幕截图

enter image description here

2 个答案:

答案 0 :(得分:1)

最后,经过长期的永恒奋斗,我找到了解决方案。感谢约书亚的大力支持。

.PYX代码进行了小的修改。看来我们必须在函数中定义所有内容,以便当代码转换为C语言时,它具有主要功能。

因此第一步是将.PYX编辑为:

from tkinter import Tk

cdef public void function():
    root = Tk()
    root.mainloop()

if __name__ == "__main__":
    function()

然后,我使用以下命令来生成头文件(.h)和C程序文件

python -m cython test.pyx --embed

这是窍门:

转到生成的C程序文件,搜索wmain函数,然后从其中删除“ w”。或者,您也可以Ctrl + F搜索wmain并将其实例替换为main。

在我的程序中,例如,只有一个wmain实例。我将其更改为main。它看起来像下面显示的代码。只需将wmain更改为main。

#if PY_MAJOR_VERSION < 3
int main(int argc, char** argv) {
#elif defined(WIN32) || defined(MS_WINDOWS)
int wmain(int argc, wchar_t **argv) 

然后,我使用GCC命令生成可执行文件。命令如下。我不明白为什么会这样。但确实如此。

x86_64-w64-mingw32-gcc-8.1.0 -mconsole -DSIZEOF_VOID_P=8 -DMS_WIN64 C:/Users/Siva/Desktop/Scripts/CYTHON/test.c -IC:/"Program Files"/Python37/include -LC:/"Program Files"/Python37/libs -lpython37 -o output

我只希望有人能解释为什么方法有效。

答案 1 :(得分:0)

环境检查失败;自动检测可能已损坏。尝试以下方法之一对其进行覆盖:

.dropna()

其中gcc -DSIZEOF_VOID_P=8 -DMS_WIN64 ... gcc -DSIZEOF_VOID_P=4 ... 常量用于64位输出,而8常量用于32位输出。您很可能配置了64位并实际调用了32位gcc。如果是这样,则在假定还安装了64位定位4的情况下,以下调用应该可以工作。

gcc