【发布时间】:2015-11-10 08:20:20
【问题描述】:
我仍然是 C 的菜鸟,所以我有一个关于链接的问题。 我们有两个程序“A”和“B”,它们链接到动态链接库“C”。
现在我们启动程序“A”和“B”。
“C”现在发生了什么事。是两个程序都加载一次,还是每个程序加载两次?
什么是,当程序B是一个Python程序时,它使用了外部函数接口?
【问题讨论】:
标签: c dynamic dll linker shared-libraries
我仍然是 C 的菜鸟,所以我有一个关于链接的问题。 我们有两个程序“A”和“B”,它们链接到动态链接库“C”。
现在我们启动程序“A”和“B”。
“C”现在发生了什么事。是两个程序都加载一次,还是每个程序加载两次?
什么是,当程序B是一个Python程序时,它使用了外部函数接口?
【问题讨论】:
标签: c dynamic dll linker shared-libraries
这一切都取决于操作系统,但对于例如Linux 或 Windows 共享库只会加载一次,但会映射两次。每个使用共享库的进程都会映射该库,但这些映射都指向同一个加载的库。
映射是在每个进程的基础上完成的,进程做什么或是什么并不重要(如果它是您创建的程序、Python 解释器或完全不同的东西)。
【讨论】:
在 google 中搜索 Dynamic linking C 得到以下结果(共享库是动态加载的)
共享库在程序启动时被加载到内存中。正确加载共享库后,所有稍后启动的程序都会自动使用已加载的共享库。
【讨论】:
在 Windows 的情况下,只有 DLL(动态链接库)代码在进程之间共享。每个进程都有自己的虚拟内存地址空间,包括 DLL 使用的数据。这意味着 DLL 通常不能具有在进程之间共享的静态缓冲区。进程或DLL代码可以设置共享内存,该共享内存可以在进程之间共享。
MSDN 文章:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms681914(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682594(v=vs.85).aspx
http://msdn.microsoft.com/en-s/library/windows/desktop/ms686958(v=vs.85).aspx
【讨论】: