使用 Cython 将 Python 编译为 C
我正在尝试使用 cython
将 python
源代码 foo.py 编译为 C 。
在 foo.py 中:
print "Hello World"
我运行的命令是 cython foo.py。
问题是,当使用 gcc
编译 foo.c 时,出现错误:
对“main”的未定义引用
。
I'm trying to compile python
source code foo.py to C using cython
.
In foo.py
:
print "Hello World"
The command I'm running is cython foo.py
.
The problem is that when compiling foo.c using gcc
, I get the error:
undefined reference to 'main'
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
当将代码从 python 转换为 c (使用 Cython)时,它将其转换为可以编译为共享对象的 c 代码。
为了使其可执行,您应该将“--embed”添加到 cython 转换命令中。这个标志添加了你需要的“main”函数,这样你就可以将c代码编译成可执行文件。
请注意,您需要 python
.so
运行时库才能运行 exec。when converting the code from python to c (using Cython) it converts it to c code which can be compiled into a shared object.
in order to make it executable, you should add "--embed" to cython conversion command. this flag adds the 'main' function you need, so you could compile the c code into executable file.
please notice you'll need the python
.so
runtime libraries in order to run the exec.阅读 Cython 文档。这也将(希望)告诉您 Cython 是什么以及它不是什么。 Cython 用于创建 Python 扩展(不是通用的 Python 到 C 编译器),它们是共享对象/dll。动态加载的库没有像独立程序那样的 main 函数,但编译器假设它们最终链接的是可执行文件。您必须通过标志告诉他们(
-shared
我认为,但再次参考 Cython 文档) - 或者更好的是,不要自己编译,使用setup.py 为此(再次阅读 Cython 文档)。
Read the Cython documentation. This will also (hopefully) teach you what Cython is and what it isn't. Cython is for creating python extensions (not a general-purpose Python-to-C-compiler), which are shared objects/dlls. Dynamically loaded libraries don't have a
main
function like standalone programs, but compilers assume that they are ultimately linking an executable. You have to tell them otherwise via flags (-shared
methinks, but again, refer to the Cython documentation) - or even better, don't compile yourself, use asetup.py
for this (yet again, read the Cython documentation).通常的方法是使用 distutils 编译 cython 生成的文件。这还以可移植的方式为您提供了所需的所有包含目录。
The usual way is to use distutils to compile the cython-generated file. This also gives you all the include directories you need in a portable way.