2011-06-23 11 views
2

私はC++で作成したパッケージを既に共有ライブラリにコンパイルしています。どのようにして、Pythonはプリコンパイルされた共有ファイルを認識するようにしますか?

自分のmain関数でリンクすると、initfooを直接呼び出すことでパッケージを初期化することができ、すべて正常に動作します。

は、どのように私はパッケージとしての私の共有ライブラリを認識するためのpythonを得るか、私はちょうど入力することができます。

import foo 

は、通常のPythonインタプリタから実行していますか?

私はファイルをコンパイルするためにdistutilsを使用することに興味はありません。コンパイルは通常のcmakeビルドシステムの一部でなければならないからです。私は共有ライブラリをロードするのに必要なパッケージファイルを作成するだけです。

更新: 私は今それを働かせます。問題はcmakeが共有ライブラリ名のlib接頭辞をデフォルトにしていることでした。この問題を解決するには、

SET_TARGET_PROPERTIES(foo PROPERTIES PREFIX "") 

を必要とし、あなたがinitfooシンボルエクスポート(ノートで共有ライブラリをお持ちの場合はMac OS X

SET_TARGET_PROPERTIES(foo PROPERTIES SUFFIX ".so") 
+0

「distutils」は、自分でやるのが面倒なので、特に存在します(http://python-history.blogspot.com/2009/03/dynamically-loaded-modules.htmlを参照) distutils'(恐らくcmakeビルドに必要な場合は2回)を完全に無意味にするでしょうか? – delnan

+0

それは問題ではありません。私のコマンドは、多くのC++関数を呼び出します。さらに、Mac OS Xでは、結果として生じる共有ライブラリは、他のすべての共有ライブラリとリンクする必要があります。 – Juan

答えて

2

のために:あなたは質問タグ付けしましたので、 - それはextern "C"だことを確認しますそれ以外の場合、名前のマングリングはインタープリタがそれを見つけられないようにします)、それはすでにPythonモジュールであり、これ以上の作業はなく直接ロードできます。他のモジュールと同様に、検索パス上にあることを確認する必要があります。

+0

ありがとうございます。私はPYTHONPATH変数を$ PWDに設定し、 "initfoo"関数がunmangledで、シンボルテーブルにあることを確認しました。 .soファイル名はlibfoo.soではなくfoo.soでなければなりません。ありがとう。 – Juan

関連する問題