在python中的mac导入中创建dylib

时间:2013-11-06 21:46:50

标签: c++ python macos dylib

您好我知道如何使用带有c ++的visual studio 2012在Windows中创建Library(dll) 并使用ctypes在python中导入工作很棒

这里的小例子

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 4.4版本在mac中运行相同的代码 当我在xcode中获取时,我得到了交战信息

__declspec attribute 'dllexport' is not supported

当在python中导入lib.dylib时出现错误

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

我做错了什么? 可以有人写一个简单的代码如何在mac中制作一个dylib与xcode正确导入python 2.6.4中的Ctypes

OR

这是在两个系统中在python中导入libaries的更好方法 为mac和win?

基本我喜欢用Visual Studio 2012 make dll我在windows中编写代码 然后使用xcode在mac中进行简单编译,在python中导入

1 个答案:

答案 0 :(得分:1)

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

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

也无法在ctypes中卸载和重新加载库。主要原因是在所有平台上都没有安全的方法 - 事实上,在10.4之前,OS X本身就是这样一个平台。 (并且Python仍然current source code in the tree支持ctypes中的10.4之前的OS X.)而且,试图想出一个在每个平台上以安全的方式做事情的模型并不是一件容易的事。因此,ctypes不会尝试。

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

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

一般来说,改为启动一个新的解释程序更好。