Re: problem in compiling C API in mingw
On Tuesday, 26 July 2011 23:53:36 UTC, llw...@gmail.com wrote: > Hi all again, > I wonder if so far only Python 2.5.x support c extension. I try the > MSVC 2010 and 2008, also try mingw (gcc 4.x.x) and swig. But even I try > the simplest example, it said > > example_wrap.o:example_wrap.c:(.text+0x10ac): undefined reference to > `_imp__PyObject_Free' > example_wrap.o:example_wrap.c:(.text+0x10f5): undefined reference to > `_imp__PyCapsule_Import' > example_wrap.o:example_wrap.c:(.text+0x1100): undefined reference to > `_imp__PyErr_Occurred' > example_wrap.o:example_wrap.c:(.text+0x110e): undefined reference to > `_imp__PyErr_Clear' > example_wrap.o:example_wrap.c:(.text+0x1125): undefined reference to > `_imp__PyImport_AddModule' > example_wrap.o:example_wrap.c:(.text+0x1144): undefined reference to > `_imp__PyCapsule_New' > example_wrap.o:example_wrap.c:(.text+0x1165): undefined reference to > `_imp__PyModule_AddObject' > example_wrap.o:example_wrap.c:(.text+0x1170): undefined reference to > `_imp__PyBaseObject_Type' > example_wrap.o:example_wrap.c:(.text+0x11b2): undefined reference to > `_imp__PyObject_SetAttr' > example_wrap.o:example_wrap.c:(.rdata+0x1e8): undefined reference to > `PyObject_GenericGetAttr' > collect2: ld returned 1 exit status > > and some sort like that. > > So I try to use the compiler itself and get rid of all 3rd part tool, > here is what I did > > / source code > #include "Python.h" > > static PyObject * > ex_foo(PyObject *self, PyObject *args) > { > printf("Hello, world n " ); > Py_INCREF(Py_None); > return Py_None; > } > > static PyMethodDef example_methods[] = { > {"foo" , ex_foo, METH_VARARGS, "foo() doc string" }, > {NULL , NULL } > }; > > static struct PyModuleDef examplemodule = { > PyModuleDef_HEAD_INIT, > "example" , > "example module doc string" , > -1 , > example_methods, > NULL , > NULL , > NULL , > NULL > }; > > PyMODINIT_FUNC > PyInit_example(void ) > { > return PyModule_Create(); > } > > /// my setup.py > from distutils.core import setup, Extension > > module1 = Extension('example', sources = ['example.c']) > > setup (name = 'example', version = '1.0', description = 'This is a demo > package', ext_modules = [module1]) > > > // running > python setup.py build --compiler=mingw32 > > > $ python setup.py build --compiler=mingw32 > running build > running build_ext > building 'example' extension > D:\Programs\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall "-Ic:\Program Files > (x8 > 6)\Python\include" "-Ic:\Program Files (x86)\Python\PC" -c example.c -o > build\te > mp.win-amd64-3.1\Release\example.o > writing build\temp.win-amd64-3.1\Release\example.def > D:\Programs\MinGW\bin\gcc.exe -mno-cygwin -shared -s > build\temp.win-amd64-3.1\Re > lease\example.o build\temp.win-amd64-3.1\Release\example.def "-Lc:\Program > Files > (x86)\Python\libs" "-Lc:\Program Files (x86)\Python\PCbuild\amd64" > -lpython31 - > lmsvcr90 -o build\lib.win-amd64-3.1\example.pyd > build\temp.win-amd64-3.1\Release\example.o:example.c:(.text+0x13): undefined > ref > erence to `_imp___Py_NoneStruct' > build\temp.win-amd64-3.1\Release\example.o:example.c:(.text+0x32): undefined > ref > erence to `_imp__PyModule_Create2' > collect2: ld returned 1 exit status > error: command 'gcc' failed with exit status 1 > - Original Message Ends You are linking against the static version of the Python library. If you link against the DLL version, this problem goes away. -Lc:\Program Files(x86)\Python\libs" should just be "-Lc:\Program Files(x86)\Python\", assuming that's where the Python DLLs are. See: https://stackoverflow.com/questions/5159353/how-can-i-get-rid-of-the-imp-prefix-in-the-linker-in-vc#5159395 -- https://mail.python.org/mailman/listinfo/python-list
problem in compiling C API in mingw
Hi all again, I wonder if so far only Python 2.5.x support c extension. I try the MSVC 2010 and 2008, also try mingw (gcc 4.x.x) and swig. But even I try the simplest example, it said example_wrap.o:example_wrap.c:(.text+0x10ac): undefined reference to `_imp__PyObject_Free' example_wrap.o:example_wrap.c:(.text+0x10f5): undefined reference to `_imp__PyCapsule_Import' example_wrap.o:example_wrap.c:(.text+0x1100): undefined reference to `_imp__PyErr_Occurred' example_wrap.o:example_wrap.c:(.text+0x110e): undefined reference to `_imp__PyErr_Clear' example_wrap.o:example_wrap.c:(.text+0x1125): undefined reference to `_imp__PyImport_AddModule' example_wrap.o:example_wrap.c:(.text+0x1144): undefined reference to `_imp__PyCapsule_New' example_wrap.o:example_wrap.c:(.text+0x1165): undefined reference to `_imp__PyModule_AddObject' example_wrap.o:example_wrap.c:(.text+0x1170): undefined reference to `_imp__PyBaseObject_Type' example_wrap.o:example_wrap.c:(.text+0x11b2): undefined reference to `_imp__PyObject_SetAttr' example_wrap.o:example_wrap.c:(.rdata+0x1e8): undefined reference to `PyObject_GenericGetAttr' collect2: ld returned 1 exit status and some sort like that. So I try to use the compiler itself and get rid of all 3rd part tool, here is what I did / source code #include Python.h static PyObject * ex_foo(PyObject *self, PyObject *args) { printf(Hello, world n ); Py_INCREF(Py_None); return Py_None; } static PyMethodDef example_methods[] = { {foo , ex_foo, METH_VARARGS, foo() doc string }, {NULL , NULL } }; static struct PyModuleDef examplemodule = { PyModuleDef_HEAD_INIT, example , example module doc string , -1 , example_methods, NULL , NULL , NULL , NULL }; PyMODINIT_FUNC PyInit_example(void ) { return PyModule_Create(examplemodule); } /// my setup.py from distutils.core import setup, Extension module1 = Extension('example', sources = ['example.c']) setup (name = 'example', version = '1.0', description = 'This is a demo package', ext_modules = [module1]) // running python setup.py build --compiler=mingw32 $ python setup.py build --compiler=mingw32 running build running build_ext building 'example' extension D:\Programs\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -Ic:\Program Files (x8 6)\Python\include -Ic:\Program Files (x86)\Python\PC -c example.c -o build\te mp.win-amd64-3.1\Release\example.o writing build\temp.win-amd64-3.1\Release\example.def D:\Programs\MinGW\bin\gcc.exe -mno-cygwin -shared -s build\temp.win-amd64-3.1\Re lease\example.o build\temp.win-amd64-3.1\Release\example.def -Lc:\Program Files (x86)\Python\libs -Lc:\Program Files (x86)\Python\PCbuild\amd64 -lpython31 - lmsvcr90 -o build\lib.win-amd64-3.1\example.pyd build\temp.win-amd64-3.1\Release\example.o:example.c:(.text+0x13): undefined ref erence to `_imp___Py_NoneStruct' build\temp.win-amd64-3.1\Release\example.o:example.c:(.text+0x32): undefined ref erence to `_imp__PyModule_Create2' collect2: ld returned 1 exit status error: command 'gcc' failed with exit status 1 - Original Message Ends -- http://mail.python.org/mailman/listinfo/python-list
Re: problem in compiling C API in mingw
On 27/07/11 01:53, llwa...@gmail.com wrote: $ python setup.py build --compiler=mingw32 running build running build_ext building 'example' extension D:\Programs\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -Ic:\Program Files (x8 6)\Python\include -Ic:\Program Files (x86)\Python\PC -c example.c -o build\te mp.win-amd64-3.1\Release\example.o writing build\temp.win-amd64-3.1\Release\example.def D:\Programs\MinGW\bin\gcc.exe -mno-cygwin -shared -s build\temp.win-amd64-3.1\Re lease\example.o build\temp.win-amd64-3.1\Release\example.def -Lc:\Program Files (x86)\Python\libs -Lc:\Program Files (x86)\Python\PCbuild\amd64 -lpython31 - lmsvcr90 -o build\lib.win-amd64-3.1\example.pyd build\temp.win-amd64-3.1\Release\example.o:example.c:(.text+0x13): undefined ref erence to `_imp___Py_NoneStruct' build\temp.win-amd64-3.1\Release\example.o:example.c:(.text+0x32): undefined ref erence to `_imp__PyModule_Create2' collect2: ld returned 1 exit status error: command 'gcc' failed with exit status 1 - Original Message Ends Curious. You appear to be using a 32-bit C compiler (mingw32), and Python appears to be installed in Program Files (x86), suggesting a 32-bit version, but distutils appears to generate directory names of the format XXX.win-amd64-3.1 - suggesting some kind of architecture conflict. Then again, I remember some bug about Python reporting the wrong architecture on Windows, so this could just be a fluke, but if your extension and Python were built for different architectures that would explain it. So the best advice I can offer at this point is: install Python 3.2, and make sure that either (a) you use a 64-bit compiler (and Python), or (b) you use a 32-bit Python (and compiler). -- http://mail.python.org/mailman/listinfo/python-list