Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中的mac导入中创建动态库 我知道如何用Visual Studio 2012用C++制作Windows中的库 在python中导入ctypes非常有效_C++_Python_Macos_Dylib - Fatal编程技术网

在python中的mac导入中创建动态库 我知道如何用Visual Studio 2012用C++制作Windows中的库 在python中导入ctypes非常有效

在python中的mac导入中创建动态库 我知道如何用Visual Studio 2012用C++制作Windows中的库 在python中导入ctypes非常有效,c++,python,macos,dylib,C++,Python,Macos,Dylib,这里有一个小例子 lib.cpp #define DLLEXPORT extern "C" __declspec(dllexport) DLLEXPORT int sum(int a,int b) { return (a+b); } lib.h test.py from ctypes import * mydll=cdll.LoadLibrary('lib.dll') print mydll.sum(2,2) 我尝试在mac上用xcode 4.4版本运行相同的代码 当我在xcode中构建时,

这里有一个小例子

lib.cpp

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

test.py

from ctypes import *
mydll=cdll.LoadLibrary('lib.dll')
print mydll.sum(2,2)
我尝试在mac上用xcode 4.4版本运行相同的代码 当我在xcode中构建时,我收到了一条消息

__declspec attribute 'dllexport' is not supported
在python中导入lib.dylib时,我得到一个错误

AttributeError: dlsym(0x101afba30, sum): symbol not found
我做错了什么? 有人能写一些简单的代码吗?我如何在mac中用xcode制作一个动态库,以便在Python2.6.4中用Ctypes正确导入

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

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

您的问题是您已经将动态库加载到了python解释器中。仅仅重建它不会影响您加载到内存中的内容

只需执行另一个
LoadLibrary
就可以重新加载库,也可以不重新加载库,而且无法强制它这样做

ctypes
中也无法卸载和重新加载库。主要原因是在所有平台上都没有安全的方法来实现这一点事实上,在10.4之前,OSX本身就是这样一个平台。(Python仍然必须在
ctypes
中支持10.4版本之前的OS X),但是,尝试提出一种在每个平台上以安全方式进行操作的模型并不是一件小事。所以,
ctypes
不会尝试

如果确实需要这样做,则
ctypes
下面的
ctypes
模块通常会将必要的函数导出到Python中。如果您知道平台的名称,可以通过
帮助(\u ctypes)
或通过查看找到它们

简而言之,在大多数现代POSIX平台(包括OS X 10.5+)上,它是
\u ctypes.dlclose(mydll.\u handle)
,而在Win32上,它是
\u ctypes.freebrary(mydll.\u handle)
。在这两种情况下,如果您再次使用
mydll
(或者您从中引用的任何函数或值),您应该祈祷出现segfault。您也可以在退出时设置故障。在Windows上,当您要求它释放库时,它实际上可能不会释放库,在某些情况下,您必须在卸载之前询问库是否准备好卸载,而且线程非常复杂,而且……好吧,请阅读MSDN上的文档,当然还有您关心的每个POSIX系统的手册页


一般来说,启动一个新的解释器进程是一个更好的主意。

您可能在设置动态库的构建方式时犯了错误,因为当我使用默认的Xcode 4.4动态库项目构建它时,或者仅从命令行使用
clang++-shared-o lib.dylib.cpp
时,我收到了警告,但是
ctypes.cdll.LoadLibrary('lib.dylib').sum(2,2)
工作正常。如果您想消除警告,应该为每个平台使用不同的
#定义
(例如,通过使用
#ifdef(u WIN32
)。但这并不影响您的问题。谢谢您的快速回复!你试着运行什么版本的python 2.6.4?我刚刚在两台不同的机器上测试了11种不同的python Apple、python.org、Homebrew和custom-build,从2.5.6到最近的3.4签出,它们都做同样的事情。你能告诉我你使用的xcode的步骤吗?要创建新的项目,以确保我做的一切都正确。感谢您的时间为一个小例子的复杂性涉及卸载库,考虑字符串常量。如果应用程序中的任何代码在库中存储了指向字符串常量的指针,卸载库将使这些指针全部无效@duskwuff:谢谢你的例子;大多数人的想法都没有超出保留对函数的引用这一显而易见的情况,但常量同样是一个问题(你可以在不知道的情况下引用一个函数,例如,如果函数返回一个值而不告诉你它是否可能来自常量)。
AttributeError: dlsym(0x101afba30, sum): symbol not found