cython
を使ってpython
のソースコードをfoo.pyにコンパイルしようとしています。Cythonを使ってPythonをCにコンパイル
foo.py
で:
print "Hello World"
私が実行しているコマンドはcython foo.py
です。
undefined reference to 'main'
:
問題がgcc
を使用したfoo.cをコンパイルするとき、私はエラーを取得するということです。
cython
を使ってpython
のソースコードをfoo.pyにコンパイルしようとしています。Cythonを使ってPythonをCにコンパイル
foo.py
で:
print "Hello World"
私が実行しているコマンドはcython foo.py
です。
undefined reference to 'main'
:
問題がgcc
を使用したfoo.cをコンパイルするとき、私はエラーを取得するということです。
コードをpythonからc(Cythonを使用)に変換すると、それを共有オブジェクトにコンパイルできるcコードに変換します。 実行可能にするには、 "--embed"をcython変換コマンドに追加する必要があります。このフラグは必要な 'main'関数を追加するので、Cコードを実行可能ファイルにコンパイルすることができます。 execを実行するにはPython .so
ランタイムライブラリが必要です。
Cythonのドキュメントを読んでください。これは、(うまくいけば)Cythonが何であるか、それが何ではないかを教えてくれるでしょう。 Cythonは共有オブジェクト/ dllであるPython拡張(汎用Python-Cコンパイラではない)を作成するためのものです。動的にロードされたライブラリは、スタンドアロンプログラムのようにmain
の機能を持ちませんが、コンパイラは最終的に実行可能ファイルをリンクしているとみなします。そうでなければ、フラグ(-shared
methinks、でもCythonのドキュメントを参照してください)でそれらを伝える必要があります。自分自身をコンパイルしないでください。setup.py
を使ってください。
一般的な方法は、distutilsを使用してcythonで生成されたファイルをコンパイルすることです。これはまた、ポータブルな方法で必要なすべてのインクルードディレクトリを提供します。
+1私の説明のために – user225312
この答えは、作業拡張の編集に終わった。 RoeeKの答えはリンクの問題を解決しましたが、Pythonがインポートに失敗した後、 'ImportError:動的モジュールはinit関数を定義していません。本当にありがとう、私は3 rtfmが示唆しているように、愚かさを仮定せずに、より少ない講義スタイルでそれを書く方がいいと思う。 – deeenes