2

我已阅读有关静态和动态库的信息。我的问题有点具体

dlopen dlclose:

Benifit of dlopen is  we can start the EXE with out
loading the necessary libraries at the begining. Only when we
need we will load the libratries and unload it from the memory.

这是动态链接库的行为。

我的问题是如果我链接库 libUtlities

ld -o EXE main.o -lUtilities 

当我运行 EXE 时,libUtlities 将在我第一次使用那里的功能之前加载到内存中

which i observed in dbx (Solaris debugger)
But will not contribute to the size of the EXE.

1.那么是静态链接还是动态链接。?

4

2 回答 2

10

不幸的是,“静态”和“动态”这两个词被过度使用了,尤其是在 C 和 C++ 中。所以,我更喜欢以下术语:

  • 链接时链接,又称“静态链接”:所有符号都在链接时从静态库中解析。结果是一个单一的、静态链接的可执行文件,没有加载时依赖项。

  • 加载时链接:这是现代平台上的标准做法,未解析的符号在共享库(Unix) 或 Windows 上不幸命名的动态链接库(DLLS) 中查找,并且仅在链接时记录引用,实际解析符号和代码加载发生在加载时。

    这会产生一个“动态链接”的可执行文件,它必须用加载器加载(例如ld.so在 Linux 上)。加载是操作系统的一部分,通常对用户是透明的,尽管它是开放的(例如ldd在 Linux 上)。所有共享库必须在加载时可用,否则程序将无法启动。

  • 运行时链接,又名“动态链接”:没有未解析的符号;dlopen()相反,运行时动态决定使用或在共享/动态库中查找符号LoadLibrary()。找不到符号是可处理的运行时条件,不是错误。这种技术通常用于插件架构,并在 Windows 上用于代码注入。

但是请注意,Linux 的共享对象和 Windows 的 DLL 之间存在根本的技术差异,它们不仅仅是同一个名称不同的东西。然而,两者都可以用于加载时和运行时链接。

于 2011-08-27T13:32:33.923 回答
3

它是动态链接。它与 . 无关dlopen dlclose。通过dlopen您手动打开动态库并调用从中导出的函数。通过动态链接,所有这些工作都由链接器完成。静态链接是针对静态库(.a文件)的链接。通过静态链接,库中的代码被链接到您的 exe 中,从而增加了它的大小。

于 2011-08-27T13:17:56.297 回答