I am trying to setup a workflow for generating .pyd and .exe files from Python 3.5.1 code with Cython and MinGW on Windows 7 64bit.
I have a simple example.py file:
def hello(x):
print("Hello",x)
if __name__=='__main__':
hello("World!")
From other threads on SO, I got the Cython command below, which generates an .c file w/o warnings.
cython --embed -o example.c example.py
When I invoke gcc, I get the following warning and don't quite know if these are critical.
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);
When I use gcc to generate the .pyd file, I get a bunch of undefined reference messages and ld exits with an error status.
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
What am I doing wrong?
What do I have to change im my workflow to generate a standalone .exe file?
With help from J.J. Hakala, I found the following commands to produce the desired output files:
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
Thanks a lot to J.J. Hakala for your support.
I managed to build a Cython based module for python 3.4 (64bit) with gcc 5.3.0 (64bit, seh)
First steps,
When using cython with --embed
cython --embed test.py
g++ -municode -mthreads -Wall -O -I/c/Python34/include -L/c/Python34/libs test.c -lpython34 -o test.exe
When creating a module,
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 seems handle dll files better than lib files when linking.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With