2010-12-12 49 views
11

cythonを使ってpythonのソースコードをfoo.pyにコンパイルしようとしています。Cythonを使ってPythonをCにコンパイル

foo.pyで:

print "Hello World" 

私が実行しているコマンドはcython foo.pyです。

undefined reference to 'main'

問題がgccを使用したfoo.cをコンパイルするとき、私はエラーを取得するということです。

答えて

19

コードをpythonからc(Cythonを使用)に変換すると、それを共有オブジェクトにコンパイルできるcコードに変換します。 実行可能にするには、 "--embed"をcython変換コマンドに追加する必要があります。このフラグは必要な 'main'関数を追加するので、Cコードを実行可能ファイルにコンパイルすることができます。 execを実行するにはPython .soランタイムライブラリが必要です。

11

Cythonのドキュメントを読んでください。これは、(うまくいけば)Cythonが何であるか、それが何ではないかを教えてくれるでしょう。 Cythonは共有オブジェクト/ dllであるPython拡張(汎用Python-Cコンパイラではない)を作成するためのものです。動的にロードされたライブラリは、スタンドアロンプ​​ログラムのようにmainの機能を持ちませんが、コンパイラは最終的に実行可能ファイルをリンクしているとみなします。そうでなければ、フラグ(-shared methinks、でもCythonのドキュメントを参照してください)でそれらを伝える必要があります。自分自身をコンパイルしないでください。setup.pyを使ってください。

+0

+1私の説明のために – user225312

+2

この答えは、作業拡張の編集に終わった。 RoeeKの答えはリンクの問題を解決しましたが、Pythonがインポートに失敗した後、 'ImportError:動的モジュールはinit関数を定義していません。本当にありがとう、私は3 rtfmが示唆しているように、愚かさを仮定せずに、より少ない講義スタイルでそれを書く方がいいと思う。 – deeenes

0

一般的な方法は、distutilsを使用してcythonで生成されたファイルをコンパイルすることです。これはまた、ポータブルな方法で必要なすべてのインクルードディレクトリを提供します。

関連する問題