linux - .dll .so -- 在 Windows 和 Linux 环境中加载

标签 linux windows dll

我的问题与 Windows 和 Linux 环境上的动态库加载(“abc.dll”或“abc.so”)有关。

我有一个 dll 或共享内存。我有两个应用程序必须使用这个 dll(abc.dll 或 abc.so)。 现在我已将此 dll(abc.dll 或 abc.so)的副本放置在各自的可执行文件文件夹中:

/folder-one/app1.exe
/folder-one/abc.dll (resp. abc.so)
/folder-two/app2.exe
/folder-two/abc.dll (resp. abc.so)

现在,当我运行 app1.exe 时,它会从其 folder-one 加载 abc 库(abc.dll 或 abc.so)并运行。
现在,当我运行 app2.exe 时,它会从其 folder-two 加载 abc-库(abc.dll 或 abc.so)并运行。

Q-1 现在我的问题是,当两个应用程序运行时,是否会加载两个 dll 副本?

Loader 在 Linux 和 Windows 环境中加载内存中的共享库(abc.dll 或 abc.so)。 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Q-2 将共享库(abc.dll 或 abc.so)作为单独的副本放在各自的文件夹中是否有缺点?

Q-3 如果我想从两个应用程序加载同一个 dll,那么公共(public)位置应该是什么(以便两个应用程序都能找到它)?

最佳答案

Q-1 Now my question is that when both the application runs then there will be two copy of the dll loaded ?

是的,库将被加载两次,因为它们位于不同的位置(并且名称本身不足以使其唯一)。

Q-2 Does there disadvantage to have (abc.dll or abc.so) as an indivisual copy in respective folders ?

主要内存消耗,因为代码将被复制(当然每个副本都有自己的数据)。这是一种简化,因为共享代码不是强制性的(Linux 和 Windows 之间是不同的)。一般来说,只读部分是共享的,读/写部分是私有(private)的(然后复制)。

此外,由于加载期间发生的基本开销(内存分配、地址重定位、依赖关系解析等),加载时间会更长。

不要忘记这也适用于每个依赖项(如果它们部署在您正在使用的库的同一文件夹中)。

最后您应该考虑部署和更新。这可能是优点也可能是缺点,但不要忘记共享库只能更新一次,并且它将升级所有依赖的应用程序;如果做得很仔细,那么它是一个优点,但如果更新可能会破坏现有代码,那么它就是一个缺点。可以管理此问题,例如,在名称中包含版本号(当您更改版本时,将不会授予兼容性)。

Q-3 If i loads the dll from two application then that should be at common location ?

是的。图书馆由其名称和位置唯一标识。在这种情况下,它不会被加载到内存中两次。

关于linux - .dll .so -- 在 Windows 和 Linux 环境中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19427073/

相关文章:

windows - 关于 W3wP.exe 的基础 - IIS 8

java - DLL 导出查看器显示函数的完整签名 - 无法从 Java 调用它们

c - Linux Kernel Module程序从IP获取域名

xml - CPPcheck html报告

c++ - 如何在后台进程中处理来自 Windows 任务管理器的 "End Task"?

windows - 如何获取在cassandra表中分配的索引列表

c# - 如何将 native DLL 与托管应用程序捆绑在一起?

c# - 如果我只有 DLL 和 PDB 文件,有没有办法在按 F12 时浏览源代码?

linux - 使用 shell 命令比较 ZIP 文件和目录

c - 在以下 NASM 任务中需要帮助