1

我正在尝试在 C++ 中动态加载 cythonized .pyd。在 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);

这是我的问题!.pyd 中不存在 foo_func,即使它位于 .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 以不同的方式对文件进行 cythonize 处理吗?这里还有什么不同?

4

1 回答 1

2

我需要强制 cython 将函数导出为可见。为此,请添加 export_symbols = [] 以强制函数在窗口中可见。

setup(
        name= "foo",
        ext_modules = cythonize(Extension('foo',sources= 
        ["foo.pyx"],export_symbols=['foo_func'])),
        include_dirs = [numpy.get_include()]
        )
于 2019-03-06T14:07:47.330 回答