使用LoadLibrary在.pyd中加载cython cdef函数时出现问题 我试图在C++中动态加载一个CythoNo.Pyd。在linux机器中,会创建一个.so文件

使用LoadLibrary在.pyd中加载cython cdef函数时出现问题 我试图在C++中动态加载一个CythoNo.Pyd。在linux机器中,会创建一个.so文件,cython,loadlibrary,pyd,Cython,Loadlibrary,Pyd,使用。因此,我可以执行以下操作: plugin = dlopen("foo.so", RTLD_LAZY); init = dlsym(plugin, "PyInit_foo); // This works! cfunc = dlsym(plugin, "foo_func"); // This works! dlclose(plguin); plugin = LoadLibraryA("foo.pyd"); init = GetProcAddress(plugin, "PyInit_foo")

使用。因此,我可以执行以下操作:

plugin = dlopen("foo.so", RTLD_LAZY);
init = dlsym(plugin, "PyInit_foo); // This works!
cfunc = dlsym(plugin, "foo_func"); // This works!
dlclose(plguin);
plugin = LoadLibraryA("foo.pyd");
init = GetProcAddress(plugin, "PyInit_foo"); // This works!
cfunc = GetProcAddress(plugin, "foo_func"); // This doesn't work..
freeLibrary(plugin);
太棒了


但是,在windows中,我希望执行以下操作:

plugin = dlopen("foo.so", RTLD_LAZY);
init = dlsym(plugin, "PyInit_foo); // This works!
cfunc = dlsym(plugin, "foo_func"); // This works!
dlclose(plguin);
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)
因此,接下来我使用
dumpbin/exports foo.pyd
查看了.pyd。唯一的函数是PyInit_foo。看来.pyd不同于.So。在linux中使用
objdump-tfoo.so
时,所有函数都在那里


对于windows,我是否需要对文件进行不同的cythonize?这里还有什么不同呢?

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

设置(
name=“foo”,
ext_modules=cythonize(扩展('foo',sources=
[“foo.pyx”],导出符号=['foo\u func']),
include_dirs=[numpy.get_include()]
)

区别在于:在*中,所有符号在默认情况下都是可见的,但在DLL中,所有符号在默认情况下都是隐藏的。链接pycd.interest时,必须将“foo_func”声明为可见。这是在装载侧还是赛顿侧?对于LoadLibrary,我找不到任何可以看到隐藏符号的额外参数。如果您将解决方案作为问题的答案而不是问题的一部分来编写,则会更好—您可以回答自己的问题,请参阅