hogehoge.c:
#include <stddef.h>
double func(double a[], int size) {
double sum = 0.0;
int i;
for (i = 0; i < size; i++) {
sum += a[i];
}
return sum;
}
hogehoge.def:
LIBRARY
"hogehoge"
#
DLLの内部名。基本的にCプログラムファイル名、DLL名と同じ
EXPORTS
hogehoge
# exportする関数
> gcc.exe -shared -o hogehoge.dll hogehoge.c hogehoge.def
> icl.exe hogehoge.c -link -dll -def:hoghoge.def -out:hogehoge.dll
# いずれのコンパイラでも、マクロを定義する場合は -D オプションを使える。 例: -DMAKE_DLL
.defファイルは使えないので、exportする関数の宣言に __attribute__((visibility("default")))
をつけ、リンク時に -fPIC オプションを指定する。
また、math libraryをリンクするときは -lm を指定する。
以下の例では、Linux特有の設定を LINUX マクロを使っている場合。
> gcc -DMAKE_DLL -DLINUX -fPIC -shared -o $file.so $file.c -lm
> gcc -DMAKE_DLL -DLINUX -o $file $file.c -lm
from ctypes import CDLL, c_double, c_int, POINTER
# ctypesモジュールから必要な関数・変数をimport
lib = CDLL('./hogehoge.dll') #
Windowsの場合。DLLを読み込む
lib = CDLL('./hogehoge.so') #
Linuxの場合。DLLを読み込む
lib.hogehoge.argtypes = (POINTER(c_double), c_int)
# 関数のプロトタイプを設定
lib.hogehoge.restype = c_double
# 戻り値の型を設定
data = [1.0, 2.0, 3.0, 4.0]
ndata = len(data)
c_array = (c_double * ndata)(*data)
#
浮動小数値元型の配列を渡す場合は、pythonのlistを変換する
result = lib.hogehoge(c_array, len(data))
print(result)
C言語の関数定義: ポインタ引数に値を返す場合
int func(double x, double y, double *ret)
{
*ret = x * y;
return 1;
}
pythonからの呼び出し
from ctypes import CDLL, c_double, c_int, POINTER
# ctypesモジュールから必要な関数・変数をimport
lib = CDLL('./hogehoge.dll') # DLLを読み込む
lib.hogehoge.argtypes = (POINTER(c_double), c_int)
# 関数のプロトタイプを設定
lib.hogehoge.restype = c_double
# 戻り値の型を設定
# 関数の引数と戻り値の型を設定
lib..func.argtypes = [c_double, c_double, POINTER(c_double)]
lib.func.restype = c_int
x = 2.0
y = 3.0
ret = c_double()
result = lib.func(x, y, byref(ret))
print("result=", result)
print("ret=", ret)