2016-01-20 192 views
3

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

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

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

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

从其他线程,我得到下面用Cython命令,该命令生成.c文件的w/o警告。

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文件?

+0

尝试加入'-shared轮候册, - 启用 - 自动图像基地轮候册, - 启用 - 自动import'到链接命令 –

+0

这不会改变任何东西。 – Juergen

+0

都是gcc和python 64bit版本? –

回答

3

在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 

PYD 64位

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 64位

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为您提供支持。

3

我设法建立用gcc 5.3.0(64位,SEH)

第一步蟒3.4(64位)基于用Cython模块,

  1. 移动python3.libpython34的.lib远C:\ Python34 \库(例如一个子目录那里)
  2. 复制从çpython34.dll:\ Windows \ System32c:\ Python34 \ libs使用Windows资源管理器(必须使用64位应用程序)。

使用时用Cython与--embed

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似乎处理DLL比LIB文件链接时更好文件。

+0

我能够编译一个简单的测试,但测试可执行文件或模块会导致崩溃。 –

+0

我切换到32位Python并设法生成并启动一个example.pyd文件(没有崩溃)。然而,使用上面提到的命令生成一个.exe文件给了我'gcc:error:无法识别的命令行选项'-municode' – Juergen

+0

@Juergen可以使用-mconsole(或不使用)吗? –