如何使用gcc从Cython编译.c代码

时间:2011-08-08 16:14:49

标签: python c gcc compilation cython

既然我已经在Windows 7上成功安装了Cython,我尝试使用Cython编译一些Cython代码,但是gcc让我的生活变得艰难。

cdef void say_hello(name):
    print "Hello %s" % name

使用gcc编译代码会抛出许多未定义的 -erros引用,我很确定libpython.a是可用的(正如安装教程所说, undefined如果缺少此文件,则抛出 -errors的引用。)

$ cython ctest.pyx
$ gcc ctest.c -I"C:\Python27\include"

C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1038): undefined reference to `_imp__PyString_FromStringAndSize'
C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1075): undefined reference to `_imp___Py_TrueStruct'
C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1086): undefined reference to `_imp___Py_ZeroStruct'
C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1099): undefined reference to `_imp___Py_NoneStruct'
C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x10b8): undefined reference to `_imp__PyObject_IsTrue'
c:/program files/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libmingw32.a(main.o):main.c:(.text+0xd2): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

奇怪的是,使用pyximport *或setup - 脚本工作得非常好,但是在处理模块时它们都不是很方便。

如何使用gcc编译使用Cython生成的.c文件?

或任何其他编译器,重要的是它可以工作!


*pyximport:导入的模块中只包含python-native函数和类而不是cdef函数和类是否正常? 像:

# filename: cython_test.pyx
cdef c_foo():
    print "c_foo !"
def foo():
    print "foo !"
    c_foo()

import pyximport as p; p.install()
import cython_test
cython_test.foo()
# foo !\nc_foo !
cython_test.c_foo()
# AttributeError, module object has no attribute c_foo


更新

调用$ gcc ctest.c "C:\Python27\libs\libpython27.a"会杀死未定义的 -erros引用,但是这个:

c:/program files/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libmingw32.a(main.o):main.c:(.text+0xd2): undefined reference to `WinMain@16'

2 个答案:

答案 0 :(得分:19)

尝试:

  
gcc -c -IC:\Python27\include -o ctest.o ctest.c
gcc -shared -LC:\Python27\libs -o ctest.pyd ctest.o -lpython27

-shared创建一个共享库。 -lpython27链接到导入库C:\ Python27 \ libs \ libpython27.a。

答案 1 :(得分:1)

这是链接器(ld)错误,而不是编译器错误。您应该提供库的路径(-l和-L),而不仅仅是标题(-I)。