1

嗨,我知道如何使用 Visual Studio 2012 使用 c++ 在 Windows 中制作库(dll)并使用 ctypes 导入 python 工作得很好

这里的小例子

库文件

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

库文件

int sum(int,int); 

测试.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,以便在 python 2.6.4 中使用 Ctypes 导入

或者

在 mac 和 win 系统中导入 python 库的更好方法是什么?

基本我喜欢用visual studio 2012在windows中编写代码make dll i,然后用xcode在mac中简单编译器并在python中导入

4

1 回答 1

0

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

只是做另一个LoadLibrary可能会或可能不会重新加载库,并且没有办法强制它这样做。

也没有办法在ctypes. 主要原因是没有安全的方法在所有平台上都这样做——事实上,在 10.4 之前,OS X 本身就是这样一个平台。(并且 Python 在树中仍然有当前的源代码,以支持 10.4 之前的 OS X。ctypes)而且,试图提出一个在每个平台上都以安全方式做事的模型并不是一件容易的事。所以,ctypes不试。

如果你真的需要这样做,_ctypes下面的模块ctypes通常会将必要的函数导出到 Python 中。如果您知道您的平台的名称,您可以使用help(_ctypes)或查看源代码来找到它们。

简而言之,在大多数现代 POSIX 平台(包括 OS X 10.5+)上,它是 . _ctypes.dlclose(mydll._handle),而在 Win32 上,它是_ctypes.FreeLibrary(mydll._handle). 在任何一种情况下,如果您mydll再次使用(或您从中引用的任何函数或值),您应该为段错误祈祷。您也可能在退出时出现段错误。在 Windows 上,当您要求它时,它实际上可能不会释放库,在某些情况下,您必须先询问库是否准备好卸载,然后才能这样做,并且存在线程复杂性,并且......好吧,请阅读FreeLibraryMSDN 上的文档,当然还有dlclose(3)您关心的每个 POSIX 系统的手册页。

一般来说,最好只启动一个新的解释器进程。

于 2013-11-06T23:56:26.597 回答