共有オブジェクト内の関数のシグネチャを知る必要があります。ソースコード、または関数名と引数の型を説明するリファレンスはありますか?
たとえば、次のソース コード ( mult.f90 ) があります。
integer function multiply(a, b)
integer, intent(in) :: a, b
multiply = a * b
end function multiply
.. 複数の共有オブジェクトを一度に読み込んで使用する方法を示すために、( add.f90 ):
integer function addtwo(a, b)
integer, intent(in) :: a, b
addtwo = a + b
end function addtwo
コンパイル、シンボルの検査:
% gfortran-4.4 -shared -fPIC -g -o mult.so mult.f90
% gfortran-4.4 -shared -fPIC -g -o add.so add.f90
% nm -ao mult.so | grep multiply
mult.so:00000000000005cc T multiply_
共有オブジェクトのシンボル名にアンダースコアが追加されていることに注意してください。私はソースを持っているので、署名がmultiply_(int *a, int *b)
であることを知っているので、 からその関数を呼び出すのは簡単ですctypes
:
from ctypes import byref, cdll, c_int
mult = cdll.LoadLibrary('./mult.so')
add = cdll.LoadLibrary('./add.so')
a = c_int(2)
b = c_int(4)
print mult.multiply_(byref(a), byref(b))
print add.addtwo_(byref(a), byref(b))
出力:
8
6