当前位置: 首页 > 面试题库 >

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

黄修永
2023-03-14
问题内容

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

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

使用gcc编译代码时,会抛出数十个 -erros的 未定义引用
,并且我很确定srclibpython.a是可用的(如安装教程所述,如果缺少此文件,则会抛出 -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-script可以很好地工作,但是当仍然在模块上工作时,两者都不太方便。

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

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

*pyximport:导入的模块中仅包含python本机函数和类,而不包含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'

问题答案:

尝试:

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链接。



 类似资料:
  • 我编译了以下C代码: 使用命令 .下面是输出中的 Bar 函数: 我有几个关于这个汇编代码的问题: > 如果函数体中既没有使用也没有使用rsp,那么"",""和""的目的是什么? 为什么和自动包含C函数的参数(分别为和)而不从堆栈中读取它们? 我尝试将Foo的大小增加到88字节(11s),指令变成了。将我的结构设计为“圆形”大小以避免乘法指令(以优化数组访问)是否有意义?指令被替换为:

  • 问题内容: 代码很简单: 有没有办法编译来自标准输出的代码? 我已经试过了: 和一些变体,但没有一个产生可执行文件。 只是一些澄清。我有一个预处理文件的程序,并生成另一个要编译的文件。我考虑过不创建此中间文件,而是直接生成目标文件。 问题答案: 编译器可能会告诉您: 尝试

  • 问题内容: 所以我想通过cython从c调用一些python代码。我设法从c调用cython代码。而且我还可以从cython调用python代码。但是,当我将它们全部加在一起时,会丢失一些东西。 这是我的python代码(): 这是我的cython“ bridge”(): 这是c代码(): 运行此命令时,出现以下异常: 我怀疑缺少的部分: 我还没打电话 我还没有 Cython没有产生任何东西- 不

  • 问题内容: 当我在Windows上使用命令编译任意一个__init__.py文件时,它具有无法解析的外部符号错误(即“ LINK:错误LNK2001:无法解析的外部符号PyInit___init__”)。 当地环境: ctest / init.py setup.py 终端打印的信息: 问题答案: 也许此行为可能被视为-package中的一个小错误(如@DavidW所指出的,存在一个未解决的问题:h

  • gcc 是 GNU 推出的功能强大、性能优越的多平台编译器,是 GNU 的代表作品之一。它能将C、C++语言源程序、汇编语言源程序和目标程序编译、链接成可执行文件,如果没有给出可执行文件的名字,gcc 将生成一个名为 a.out 的文件。 gcc 通过后缀来区分输入文件的类型: 后缀 类型 .c C语言源代码文件 .a 由目标文件构成的档案库文件 .C|.cc|.cxx C++源代码文件 .h 程

  • 通过前面章节的学习我们知道,GCC 编译器并未提供给用户可用鼠标点击的界面窗口,要想调用 GCC 编译器编译 C 或者 C++ 程序,只能通过执行相应的 gcc 或者 g++ 指令。本节将重点给大家讲解如何编写 gcc 或者 g++ 指令来编译 C、C++ 程序。 注意,在前面的讲解中我们一直提到“编译”C、C++ 程序,其本意指的是将 C、C++ 代码转变为可执行程序(等同于 Windows 系