在Windows 7(64位)上使用Cython和MinGW编译Python 3.5代码

在Windows 7(64位)上使用Cython和MinGW编译Python 3.5代码,python,gcc,mingw,cython,Python,Gcc,Mingw,Cython,我正在尝试设置一个工作流,以便在64位Windows 7上使用Cython和MinGW从Python 3.5.1代码生成.pyd和.exe文件 我有一个简单的example.py文件: def hello(x): print("Hello",x) if __name__=='__main__': hello("World!") 从其他线程中,我得到了下面的Cython命令,该命令生成了一个不包含警告的.c文件 cython --embed -o example.c examp

我正在尝试设置一个工作流,以便在64位Windows 7上使用Cython和MinGW从Python 3.5.1代码生成.pyd和.exe文件

我有一个简单的example.py文件:

def hello(x):
    print("Hello",x)

if __name__=='__main__':
    hello("World!")
从其他线程中,我得到了下面的Cython命令,该命令生成了一个不包含警告的.c文件

cython --embed -o example.c example.py
当我调用gcc时,我得到以下警告,不知道这些警告是否是关键的

gcc -c -IC:\Python35\include -o example.o example.c

In file included from C:\Python35\include/Python.h:65:0,
                 from example.c:4:
C:\Python35\include/pytime.h:113:5: warning: 'struct timeval' declared inside pa
rameter list [enabled by default]
     _PyTime_round_t round);
     ^
C:\Python35\include/pytime.h:113:5: warning: its scope is only this definition o
r declaration, which is probably not what you want [enabled by default]
C:\Python35\include/pytime.h:118:5: warning: 'struct timeval' declared inside pa
rameter list [enabled by default]
     _PyTime_round_t round);
当我使用gcc生成.pyd文件时,我得到一堆未定义的引用消息,ld退出时状态为错误

gcc -shared -LC:\Python35\libs -o example.pyd example.o -lpython35

example.o:example.c:(.text+0x46): undefined reference to `_imp__PyObject_GetAttr
'
example.o:example.c:(.text+0xad): undefined reference to `_imp__PyTuple_New'
example.o:example.c:(.text+0x1be): undefined reference to `_imp___Py_NoneStruct'

example.o:example.c:(.text+0x1c6): undefined reference to `_imp___Py_NoneStruct'

example.o:example.c:(.text+0x1d0): undefined reference to `_imp___Py_NoneStruct'

example.o:example.c:(.text+0x2e2): undefined reference to `_imp__PyTuple_Pack'
example.o:example.c:(.text+0x3bc): undefined reference to `_imp__PyCode_New'
example.o:example.c:(.text+0x409): undefined reference to `_imp__PyTuple_Pack'
example.o:example.c:(.text+0x4f3): undefined reference to `_imp__PyTuple_New'
example.o:example.c:(.text+0x53a): undefined reference to `_imp__PyBytes_FromStr
ingAndSize'
example.o:example.c:(.text+0x5a5): undefined reference to `_imp__PyModule_Create
2'
example.o:example.c:(.text+0x5e5): undefined reference to `_imp__PyModule_GetDic
t'
example.o:example.c:(.text+0x630): undefined reference to `_imp__PyImport_AddMod
ule'
example.o:example.c:(.text+0x682): undefined reference to `_imp__PyObject_SetAtt
rString'
example.o:example.c:(.text+0x6ef): undefined reference to `_imp__PyObject_SetAtt
rString'
example.o:example.c:(.text+0x715): undefined reference to `_imp__PyImport_GetMod
uleDict'
example.o:example.c:(.text+0x756): undefined reference to `_imp__PyDict_GetItemS
tring'
example.o:example.c:(.text+0x778): undefined reference to `_imp__PyDict_SetItemS
tring'
example.o:example.c:(.text+0x87e): undefined reference to `_imp__PyDict_SetItem'

example.o:example.c:(.text+0xa7f): undefined reference to `_imp__PyDict_New'
example.o:example.c:(.text+0xac8): undefined reference to `_imp__PyDict_SetItem'

example.o:example.c:(.text+0xc04): undefined reference to `_imp__PyErr_Occurred'

example.o:example.c:(.text+0xc0f): undefined reference to `_imp__PyExc_ImportErr
or'
example.o:example.c:(.text+0xc21): undefined reference to `_imp__PyErr_SetString
'
example.o:example.c:(.text+0xc5f): undefined reference to `_imp__PyExc_NameError
'
example.o:example.c:(.text+0xc78): undefined reference to `_imp__PyErr_Format'
example.o:example.c:(.text+0xcb8): undefined reference to `_imp__PyObject_Call'
example.o:example.c:(.text+0xcc4): undefined reference to `_imp__PyThreadState_G
et'
example.o:example.c:(.text+0xcd7): undefined reference to `_imp___Py_CheckRecurs
ionLimit'
example.o:example.c:(.text+0xcf1): undefined reference to `_imp___Py_CheckRecurs
iveCall'
example.o:example.c:(.text+0xd2a): undefined reference to `_imp__PyThreadState_G
et'
example.o:example.c:(.text+0xd3d): undefined reference to `_imp___Py_CheckRecurs
ionLimit'
example.o:example.c:(.text+0xd4b): undefined reference to `_imp___Py_CheckRecurs
ionLimit'
example.o:example.c:(.text+0xd57): undefined reference to `_imp___Py_CheckRecurs
ionLimit'
example.o:example.c:(.text+0xd6d): undefined reference to `_imp__PyThreadState_G
et'
example.o:example.c:(.text+0xd86): undefined reference to `_imp__PyErr_Occurred'

example.o:example.c:(.text+0xd99): undefined reference to `_imp__PyExc_SystemErr
or'
example.o:example.c:(.text+0xdab): undefined reference to `_imp__PyErr_SetString
'
example.o:example.c:(.text+0xdcb): undefined reference to `_imp__PyImport_AddMod
ule'
example.o:example.c:(.text+0xe02): undefined reference to `_imp__PyObject_GetAtt
rString'
example.o:example.c:(.text+0xe25): undefined reference to `_imp__PyExc_TypeError
'
example.o:example.c:(.text+0xe3b): undefined reference to `_imp__PyErr_Format'
example.o:example.c:(.text+0xe61): undefined reference to `_imp__PyExc_TypeError
'
example.o:example.c:(.text+0xe77): undefined reference to `_imp__PyErr_Format'
example.o:example.c:(.text+0xe83): undefined reference to `_imp__PyExc_Attribute
Error'
example.o:example.c:(.text+0xe8d): undefined reference to `_imp__PyErr_Exception
Matches'
example.o:example.c:(.text+0xe9d): undefined reference to `_imp__PyErr_Clear'
example.o:example.c:(.text+0xeaa): undefined reference to `_imp__PyType_Ready'
example.o:example.c:(.text+0xece): undefined reference to `_imp__PyObject_SetAtt
rString'
example.o:example.c:(.text+0xf95): undefined reference to `_imp__PyUnicode_FromS
tring'
example.o:example.c:(.text+0xfbb): undefined reference to `_imp___Py_NoneStruct'

example.o:example.c:(.text+0xfc5): undefined reference to `_imp___Py_NoneStruct'

example.o:example.c:(.text+0xfcc): undefined reference to `_imp___Py_NoneStruct'

example.o:example.c:(.text+0xffd): undefined reference to `_imp___Py_NoneStruct'

example.o:example.c:(.text+0x107e): undefined reference to `_imp__PyUnicode_Inte
rnFromString'
example.o:example.c:(.text+0x10e7): undefined reference to `_imp__PyExc_TypeErro
r'
example.o:example.c:(.text+0x10f9): undefined reference to `_imp__PyErr_SetStrin
g'
example.o:example.c:(.text+0x11ac): undefined reference to `_imp__PyExc_TypeErro
r'
example.o:example.c:(.text+0x11be): undefined reference to `_imp__PyErr_SetStrin
g'
example.o:example.c:(.text+0x1240): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x1272): undefined reference to `_imp__PyDict_New'
example.o:example.c:(.text+0x12c1): undefined reference to `_imp__PyExc_TypeErro
r'
example.o:example.c:(.text+0x12d3): undefined reference to `_imp__PyErr_SetStrin
g'
example.o:example.c:(.text+0x12fe): undefined reference to `_imp__PyExc_TypeErro
r'
example.o:example.c:(.text+0x1310): undefined reference to `_imp__PyErr_SetStrin
g'
example.o:example.c:(.text+0x1398): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x13a2): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x13a9): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x13c8): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x1485): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x148f): more undefined references to `_imp___Py_None
Struct' follow
example.o:example.c:(.text+0x14ab): undefined reference to `_imp__PyExc_TypeErro
r'
example.o:example.c:(.text+0x14bd): undefined reference to `_imp__PyErr_SetStrin
g'
example.o:example.c:(.text+0x1572): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x1598): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x15a2): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x15be): undefined reference to `_imp__PyExc_TypeErro
r'
example.o:example.c:(.text+0x15d0): undefined reference to `_imp__PyErr_SetStrin
g'
example.o:example.c:(.text+0x1685): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x16ab): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x16d0): undefined reference to `_imp__PyExc_TypeErro
r'
example.o:example.c:(.text+0x16e2): undefined reference to `_imp__PyErr_SetStrin
g'
example.o:example.c:(.text+0x1778): undefined reference to `_imp__PyDict_New'
example.o:example.c:(.text+0x17c3): undefined reference to `_imp__PyUnicode_From
String'
example.o:example.c:(.text+0x17d8): undefined reference to `_imp___PyObject_GC_N
ew'
example.o:example.c:(.text+0x1913): undefined reference to `_imp__PyObject_GC_Tr
ack'
example.o:example.c:(.text+0x1cef): undefined reference to `_imp__PyMem_Free'
example.o:example.c:(.text+0x1d13): undefined reference to `_imp__PyObject_GC_Un
Track'
example.o:example.c:(.text+0x1d2a): undefined reference to `_imp__PyObject_Clear
WeakRefs'
example.o:example.c:(.text+0x1d42): undefined reference to `_imp__PyObject_GC_De
l'
example.o:example.c:(.text+0x2030): undefined reference to `_imp__PyMethod_New'
example.o:example.c:(.text+0x203f): undefined reference to `_imp__PyInstanceMeth
od_New'
example.o:example.c:(.text+0x2048): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x206c): undefined reference to `_imp__PyMethod_New'
example.o:example.c:(.text+0x207b): undefined reference to `_imp__PyInstanceMeth
od_New'
example.o:example.c:(.text+0x20a2): undefined reference to `_imp__PyUnicode_From
Format'
example.o:example.c:(.text+0x20c5): undefined reference to `_imp__PyCFunction_Ca
ll'
example.o:example.c:(.text+0x20d4): undefined reference to `_imp__PyCFunction_Ca
ll'
example.o:example.c:(.text+0x211b): undefined reference to `_imp__PyDict_GetItem
'
example.o:example.c:(.text+0x216e): undefined reference to `_imp__PyUnicode_Type
'
example.o:example.c:(.text+0x2184): undefined reference to `_imp__PyUnicode_Type
'
example.o:example.c:(.text+0x21bb): undefined reference to `_imp___PyUnicode_Rea
dy'
example.o:example.c:(.text+0x21e3): undefined reference to `_imp___PyUnicode_Rea
dy'
example.o:example.c:(.text+0x260b): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x2625): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x2650): undefined reference to `_imp__PyObject_RichC
ompare'
example.o:example.c:(.text+0x286b): undefined reference to `_imp__PyMem_Malloc'
example.o:example.c:(.text+0x299f): undefined reference to `_imp__PyMem_Realloc'

example.o:example.c:(.text+0x2a79): undefined reference to `_imp__PyUnicode_From
String'
example.o:example.c:(.text+0x2ab2): undefined reference to `_imp__PyUnicode_From
Format'
example.o:example.c:(.text+0x2ac4): undefined reference to `_imp__PyUnicode_From
String'
example.o:example.c:(.text+0x2b60): undefined reference to `_imp__PyCode_New'
example.o:example.c:(.text+0x2cca): undefined reference to `_imp__PyThreadState_
Get'
example.o:example.c:(.text+0x2ce7): undefined reference to `_imp__PyFrame_New'
example.o:example.c:(.text+0x2d08): undefined reference to `_imp__PyTraceBack_He
re'
example.o:example.c:(.text+0x2da1): undefined reference to `_imp__Py_SetProgramN
ame'
example.o:example.c:(.text+0x2da8): undefined reference to `_imp__Py_Initialize'

example.o:example.c:(.text+0x2dc8): undefined reference to `_imp__PySys_SetArgv'

example.o:example.c:(.text+0x2de8): undefined reference to `_imp__PyErr_Occurred
'
example.o:example.c:(.text+0x2df3): undefined reference to `_imp__PyErr_Print'
example.o:example.c:(.text+0x2e3a): undefined reference to `_imp__Py_Finalize'
example.o:example.c:(.text+0x2e77): undefined reference to `_imp__PyOS_snprintf'

example.o:example.c:(.text+0x2e7e): undefined reference to `_imp__Py_GetVersion'

example.o:example.c:(.text+0x2e9f): undefined reference to `_imp__PyOS_snprintf'

example.o:example.c:(.text+0x2eed): undefined reference to `_imp__PyOS_snprintf'

example.o:example.c:(.text+0x2f0d): undefined reference to `_imp__PyErr_WarnEx'
example.o:example.c:(.text+0x2f5a): undefined reference to `_imp__PyUnicode_Inte
rnFromString'
example.o:example.c:(.text+0x2f9f): undefined reference to `_imp__PyUnicode_Deco
de'
example.o:example.c:(.text+0x2fc5): undefined reference to `_imp__PyUnicode_From
StringAndSize'
example.o:example.c:(.text+0x2feb): undefined reference to `_imp__PyBytes_FromSt
ringAndSize'
example.o:example.c:(.text+0x3028): undefined reference to `_imp___Py_TrueStruct
'
example.o:example.c:(.text+0x3039): undefined reference to `_imp___Py_FalseStruc
t'
example.o:example.c:(.text+0x304c): undefined reference to `_imp___Py_NoneStruct
'
example.o:example.c:(.text+0x306b): undefined reference to `_imp__PyObject_IsTru
e'
collect2.exe: error: ld returned 1 exit status
我做错了什么


为了生成一个独立的.exe文件,我必须更改我的工作流程吗?

我设法用gcc 5.3.0(64位,seh)为python 3.4(64位)构建了一个基于Cython的模块

第一步

  • 将python3.lib和python34.lib从c:\python34\libs中移出(例如,其中的子目录)
  • 使用Windows资源管理器将python34.dll从C:\Windows\System32复制到C:\python34\libs(必须使用64位应用程序)
  • 将cython与--嵌入一起使用时

    cython --embed test.py
    g++ -municode -mthreads -Wall -O -I/c/Python34/include -L/c/Python34/libs test.c -lpython34 -o test.exe
    
    创建模块时

    cython test.py
    gcc -mdll -O -Wall -I/c/Python34/include -c test.c
    gcc -shared -L/c/Python34/libs test.o -lpython34 -o test.pyd
    

    在链接时,gcc似乎比lib文件更好地处理dll文件。

    在J.J.Hakala的帮助下,我找到了以下命令来生成所需的输出文件:

    pyd 32位

    cython -o example.c example.py
    gcc -c -Ofast -IC:\Python35-32\include -o example.o example.c
    gcc -shared -LC:\Python35-32\libs -o example.pyd example.o -lpython35
    
    cython -o example.c example.py
    gcc -c -DMS_WIN64 -Ofast -IC:\Python35\include -o example.o example.c
    gcc -shared -LC:\Python35\libs -o example.pyd example.o -lpython35
    
    cython --embed -o example.c example.py
    gcc -municode -DMS_WIN64 -mthreads -Wall -O -IC:\Python35\include -LC:\Python35\libs example.c -lpython35 -o example.exe
    
    pyd 64位

    cython -o example.c example.py
    gcc -c -Ofast -IC:\Python35-32\include -o example.o example.c
    gcc -shared -LC:\Python35-32\libs -o example.pyd example.o -lpython35
    
    cython -o example.c example.py
    gcc -c -DMS_WIN64 -Ofast -IC:\Python35\include -o example.o example.c
    gcc -shared -LC:\Python35\libs -o example.pyd example.o -lpython35
    
    cython --embed -o example.c example.py
    gcc -municode -DMS_WIN64 -mthreads -Wall -O -IC:\Python35\include -LC:\Python35\libs example.c -lpython35 -o example.exe
    
    exe 64位

    cython -o example.c example.py
    gcc -c -Ofast -IC:\Python35-32\include -o example.o example.c
    gcc -shared -LC:\Python35-32\libs -o example.pyd example.o -lpython35
    
    cython -o example.c example.py
    gcc -c -DMS_WIN64 -Ofast -IC:\Python35\include -o example.o example.c
    gcc -shared -LC:\Python35\libs -o example.pyd example.o -lpython35
    
    cython --embed -o example.c example.py
    gcc -municode -DMS_WIN64 -mthreads -Wall -O -IC:\Python35\include -LC:\Python35\libs example.c -lpython35 -o example.exe
    

    非常感谢J.J.Hakala的支持。

    尝试将
    -shared-Wl,--enable auto image base-Wl,--enable auto import
    添加到链接命令这不会改变任何东西。gcc和python都是64位版本吗?python肯定是64位的,但我不确定gcc。gcc——版本为4.8.1,来自MinGW安装管理器,我想它相当于32位。从哪里可以获得64位版本的MinGW?或者我应该切换到Python 32位吗?我会使用msys2。然后,您可以选择安装gcc(64位,但链接到libmsys)和mingw32&mingw64。我在完全相同的问题atm机,并已恢复到32位py34。这篇文章应该允许我转到64位py34。但是现在mingw由于一个变化而不能容忍py35扩展。我能够编译一个简单的测试,但是测试可执行文件或模块会导致崩溃。我切换到32位Python,并设法生成并启动一个example.pyd文件(没有崩溃)。但是,使用上述命令生成.exe文件会给我
    gcc:error:无法识别的命令行选项'-municode'
    w/o-municode,我得到
    未定义的引用'WinMain@16“
    。使用gcc 5.3.0(64位),我能够生成pyd和exe文件,但都会崩溃。@Juergen我添加了flag
    -DMS\u WIN64
    ,现在我似乎能够为64位python 3.5构建基于cython的exe/模块