Я пытаюсь динамически загрузить cythonized .pyd в C ++.На Linux-машине создается файл .so.
Используя .so, я могу сделать следующее:
plugin = dlopen("foo.so", RTLD_LAZY);
init = dlsym(plugin, "PyInit_foo); // This works!
cfunc = dlsym(plugin, "foo_func"); // This works!
dlclose(plguin);
Что прекрасно работает!
Однако в Windows я хочу сделать следующее:
plugin = LoadLibraryA("foo.pyd");
init = GetProcAddress(plugin, "PyInit_foo"); // This works!
cfunc = GetProcAddress(plugin, "foo_func"); // This doesn't work..
freeLibrary(plugin);
Это моя проблема!foo_func не существует в .pyd, даже если он находится в .so
Оба сделаны с использованием одного и того же setup.py:
from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy
setup(
name= "foo",
ext_modules = cythonize("foo.pyx"),
include_dirs = [numpy.get_include()]
)
И пример foo.pyx
cdef public void foo_func(int i) with gil:
print(i)
Итак, я посмотрел на .pyd, используя dumpbin /exports foo.pyd
.И единственная функция - PyInit_foo.Таким образом, кажется, что .pyd отличается от .so.При использовании objdump -T foo.so
в Linux все функции есть!
Нужно ли по-разному цифонизировать файл для Windows?Что еще может отличаться здесь?