web-dev-qa-db-ja.com

Cythonからgccを使用して.cコードをコンパイルする方法

CythonをWindows7に正常にインストールしたので、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スクリプトを使用するとかなりうまく機能しますが、モジュールで作業しているときはどちらもあまり便利ではありません。

gccを使用してCythonで生成された.cファイルをコンパイルする方法は?

または他のコンパイラ、重要なのはそれが動作することです!


*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'
20
Niklas R

試してみてください:

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とリンクします。

19
Eryk Sun

これはリンカー(ld)エラーであり、コンパイラエラーではありません。ヘッダー(-I)だけでなく、ライブラリー(-lおよび-L)へのパスを指定する必要があります。

1
Francesco