質問

こんにちは私はC ++を備えたVisual Studio 2012を備えたWindowsでライブラリ(DLL)を作成する方法を知っています。

ここで小さな例

lib.cpp

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int sum(int a,int b)
{
return (a+b);
}

lib.H

int sum(int,int); 

test.py

from ctypes import *
mydll=cdll.LoadLibrary('lib.dll')
print mydll.sum(2,2)

Xcode 4.4バージョンでMacで同じコードを実行してみてくださいXcodeで膨らんだときにウォーリングメッセージが表示されます

__declspec attribute 'dllexport' is not supported

また、pythonにlib.dylibをインポートすると、エラーが発生します

AttributeError: dlsym(0x101afba30, sum): symbol not found

私は何が間違っていますか? python 2.6.4のctypesでインポートするためにxcodeを正しく正しいMacでMACにdylibを作成する方法を作成する人もいればいい人もいますか

また

MACとWINの両方のシステムでPythonに自由をインポートするより良い方法はありますか?

基本的な私はVisual Studio 2012でWindowsでコードを作成するのが好きです。DLLI、次にXCodeとPythonでインポートするMacでシンプルなコンパイラを作成します

役に立ちましたか?

解決

あなたの問題は、あなたがすでにあなたのPythonインタープリターにディリブをロードしていることです。再構築するだけで、メモリにロードしたものには影響しません。

別のことをしているだけです LoadLibrary ライブラリを再ロードするかもしれないし、しないかもしれないし、それを強制する方法はありません。

ライブラリをアンロードしてリロードする方法もありません ctypes. 。主な理由は、すべてのプラットフォームで安全な方法がないことです。実際、10.4以前のOS X自体がそのようなプラットフォームであったことです。 (そして、Pythonにはまだあります ツリー内の現在のソースコード Pre-10.4 OS Xをサポートします ctypes。)しかし、すべてのプラットフォームで安全な方法を実行するモデルを考え出そうとすることは、正確に些細なものではありません。そう、 ctypes 試してみません。

あなたが本当にそれをする必要があるなら、 _ctypes 下のモジュール ctypes 通常、必要な関数をPythonにエクスポートします。プラットフォームの名前を知っている場合は、 help(_ctypes), 、または見ることによって 起源.

簡単に言えば、ほとんどの最新のPOSIXプラットフォーム(OS X 10.5+を含む)では _ctypes.dlclose(mydll._handle), 、Win32ではそうです _ctypes.FreeLibrary(mydll._handle). 。どちらの場合でも、使用する場合 mydll 繰り返しますが(またはあなたがそこから参照していた機能または価値)、あなたはsegfaultを祈るべきです。また、出口でsegfaultすることもできます。また、Windowsでは、尋ねたときにライブラリが実際に解放されない場合があり、場合によっては、できることができる前にアンロードする準備ができているかどうかをライブラリに尋ねる必要があります。 FreeLibrary MSDNのドキュメント、そしてもちろんのマンページ dlclose(3) あなたが気にするすべてのPOSIXシステムで。

一般的に、代わりに新しいインタープリタープロセスを開始するだけではるかに良いアイデアです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top