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