2010-12-12 141 views
11

我试图使用cythonpython源代码foo.py编译为C.使用Cython将Python编译为C

foo.py

print "Hello World" 

我跑的命令是cython foo.py

的问题是,使用gcc编译foo.c的时候,我得到的错误:

undefined reference to 'main'

回答

19

将代码从python转换为c(使用Cython)时,它将其转换为可以编译到共享对象中的c代码。 为了使其可执行,您应该将“--embed”添加到cython转换命令中。这个标志增加了你需要的'main'功能,所以你可以把c代码编译成可执行文件。 请注意,您需要python .so运行时库才能运行该exec。

11

阅读Cython文档。这也会(希望)会教你什么是Cython,什么不是。 Cython用于创建Python扩展(不是通用Python-to-C编译器),它们是共享对象/ dll。动态加载库不像独立程序那样具有main函数,但编译器假定它们最终链接一个可执行文件。您必须通过标志(-shared methinks,但请再次参考Cython文档)告诉他们 - 或者甚至更好,不要编译自己,请使用setup.py(另请阅读Cython文档)。

+0

+1为解释 – user225312 2010-12-12 13:55:10

+2

对我来说,这个答案导致编译一个工作扩展。 RoeeK的答案解决了链接问题,但是在Python导入错误“ImportError:动态模块没有定义init函数”后无法导入。非常感谢你,我认为在不假设愚蠢的情况下用更少的演讲风格写出它会更好,正如3 rtfm所暗示的那样。 – deeenes 2015-11-19 14:51:18

0

通常的方法是使用distutils编译cython生成的文件。这也以便携的方式为您提供所需的所有包含目录。