c++ - 当同一个库动态和静态链接到 C++ 程序时会发生什么?

标签 c++ compilation linker

<分区>

我遇到过静态链接和共享库的代码,并且两者包含的函数名称也相同。链接器如何决定链接哪个库。 我在此路径/etc/ld.so.conf 中添加 foobar.so 库可执行路径以及 -I/(include files path) -l(executable name) -L(library executable path ) .在此之后我执行了 ldconfig 。我正在使用 gcc 编译器版本 gcc (GCC) 4.4.7

最佳答案

这实际上取决于您使用的运行时环境,以及“共享”或“动态”库在该环境中的实现方式。

有一种方法,其中每个动态库都带有一个静态链接的“ stub ”库,因此编译器解析您对 stub 方法的调用,并且 stub 方法在库加载后转发给动态加载的库。这在您的情况下绝对行不通,因为每个 stub 方法都会与静态链接方法冲突。

还有另一种方法,加载一个动态库会给您一个该库的句柄,然后您可以查询系统以获取该句柄上的入口点,并动态调用这些入口点。在这种情况下,链接器根本不参与动态入口点的解析,因此拥有提供等效入口点的静态链接库完全没有问题(除了毫无意义)。

关于c++ - 当同一个库动态和静态链接到 C++ 程序时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34105005/

相关文章:

C++ Eclipse Galileo 让它显示行号 - 怎么样?

c++ - 什么时候应该使用命名空间和单独编译? (是否可以在类外使用单独编译?)

c++ - 一个应用程序中同一库的两个版本

objective-c - XCode 不会将我的 iPhone 设置为事件方案

c++ - 减去两个字符并将它们添加到字符串

c++ - SDL iOS 禁用事件泵

compilation - 我正在运行的 php 是如何编译的?

c++ - 编译 boost 文件系统的教程文件时遇到问题

c++ - Qt - 编译错误 : Couldn't change working directory

c++ - Visual Studio 2019 找不到很多头文件