嗨,我知道如何使用C ++的Visual Studio在Windows中制作图书馆(DLL),并在Python中带有CTYPES的效果很好

这里很小的例子

lib.cpp

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int sum(int a,int b)
{
return (a+b);
}

lib.h

int sum(int,int); 

test.py

from ctypes import *
mydll=cdll.LoadLibrary('lib.dll')
print mydll.sum(2,2)

我尝试在XCode大小时使用Xcode 4.4版本在Mac中运行相同的代码,我会收到交战消息

__declspec attribute 'dllexport' is not supported

当导入python中的lib.dylib时,我会出现错误

AttributeError: dlsym(0x101afba30, sum): symbol not found

我做错了什么?有人可以编写简单的代码,我如何在Mac中使用Xcode正确制作Dylib,以正确地用Ctypes在Python 2.6.4中导入

或者

这是在Mac和Win系统中进口Python的Libaries的更好方法吗?

BASIC我喜欢在Windows中使用Visual Studio 2012编写代码制作DLL I,然后在Mac中使用Xcode和Python中导入的简单编译器

有帮助吗?

解决方案

您的问题是,您已经将Dylib加载到Python解释器中。只是重建它不会影响您已加载到内存中的内容。

只是做另一个 LoadLibrary 可能会或可能不会重新加载库,也无法强迫它这样做。

也没有办法可以卸载和重新加载库 ctypes. 。主要原因是在所有平台上都没有安全的方法 - 实际上,在10.4之前,OS X本身就是这样的平台。 (而Python仍然有 树中的当前源代码 支持10.4 os x in ctypes。所以, ctypes 不尝试。

如果您真的需要这样做, _ctypes 下面的模块 ctypes 通常将必要的功能导出到Python中。如果您知道平台的名称,可以找到它们 help(_ctypes), ,或通过看 来源.

简而言之,在大多数现代POSIX平台(包括OS X 10.5+)上 _ctypes.dlclose(mydll._handle), ,在Win32上,是 _ctypes.FreeLibrary(mydll._handle). 。无论哪种情况,如果您都使用 mydll 再次(或您从中引用的任何功能或值),您应该为segfault祈祷。您也可以在退出时进行策略。在Windows上,当您询问库时,它实际上可能不会释放库,在某些情况下,您必须询问图书馆是否准备就绪,然后才能卸载,并且有线程的复杂性,并且……好吧,请阅读这 FreeLibrary 关于MSDN的文档,当然还有 dlclose(3) 在您关心的每个POSIX系统上。

通常,仅启动新的解释器流程是一个更好的主意。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top