Вам необходимо знать сигнатуры функций в общем объекте.У вас есть исходный код или какая-либо ссылка, объясняющая имена функций и типы аргументов?
Например, у меня есть этот исходный код ( 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