繁体   English   中英

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

[英]Compiling Python 3.5 code with Cython and MinGW on Windows 7 (64bit)

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

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

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

if __name__=='__main__':
    hello("World!")

从SO上的其他线程,我得到了下面的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文件?

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

pyd 32bit

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

pyd 64bit

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

exe 64bit

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

非常感谢JJ Hakala的支持。

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

第一步,

  1. python3.libpython34.lib移离c:\\ Python34 \\ libs (例如那里的子目录)
  2. 使用Windows资源管理器将python34.dllC:\\ Windows \\ System32复制到c:\\ Python34 \\ libs (必须为64位应用程序)。

使用带有--embed的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文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM