Как скомпилировать код .c из Cython с помощью gcc - PullRequest
19 голосов
/ 08 августа 2011

Теперь, когда я успешно установил Cython в Windows 7, я пытаюсь скомпилировать некоторый код Cython с использованием Cython, но gcc усложняет мою жизнь.

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

Использование gcc для компиляции кода выдает десятки неопределенных ссылок на -erros, и я почти уверен, что libpython.a доступен (как сказано в руководстве по установке, неопределенная ссылка на - выдается ошибка, если этот файл отсутствует).

$ 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 -скрипта работает довольно хорошо, но оба они не очень удобны, когда все еще работают с модулем.

Как скомпилировать эти .c файлы, созданные с помощью Cython, используя gcc?

или любой другой компилятор, важно, чтобы он работал!


*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


UPDATE

При вызове $ 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 ]

19 голосов
/ 08 августа 2011

Попробуйте:

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 голос
/ 08 августа 2011

Это ошибка компоновщика (ld), а не ошибка компилятора.Вы должны указать путь к библиотеке (-l и -L), а не только к заголовкам (-I).

...