【发布时间】:2015-12-15 00:36:41
【问题描述】:
(希望这不会变得太复杂......)
我已经构建了一个第三方 C++ 库 libfoo,其中包含静态 (libfoo.a) 和共享 (libfoo.so) 版本。目标文件是使用 -fPIC 创建的。 libfoo 有几个用于配置其行为的全局变量,以及依赖这些全局变量的函数,为简单起见,函数 func1() 与变量 global_a 交互。
我已经构建了我的 C++ 共享库 libbar,我已经静态链接到 libfoo.a。这是在没有 --whole-archive 选项的情况下完成的。所以我相信libbar.so 包含了libfoo.a 所需的所有符号和定义。这个库调用来自libfoo 的函数,它使用全局变量来控制行为。在这种情况下,假设它调用函数func1()。
最后,我有一个 C++ 客户端程序 baz,它动态链接到 libfoo.so 和 libbar.so。此客户端还使用来自libfoo 的相同函数/全局变量。它修改global_a并调用func1()。
一般来说,在这种情况下客户端baz 的行为是什么?这种配置是我应该避免的,还是可以?如果libfoo.a 和libfoo.so 是不同的版本会怎样?
对于全局变量,我有点期待libbar.so 中的代码会使用自己的副本,baz 中的任何更改都会修改libfoo.so 中的副本,但这不是我所看到的。当baz修改global_a时,在libbar.so中可以看到效果。客户端baz 没有我能看出的任何其他异常行为。
我还尝试将baz 与libfoo.a 链接,并看到相同的(显然是正确的)行为。
无论哪种情况,Valgrind 都没有显示任何错误。
【问题讨论】:
标签: c++ linker global-variables shared-libraries static-libraries