0

当我有一个抽象基类foo时,定义在libX.a

class foo {
    virtual void bar() = 0;
};

...和一个派生类foo_impl,定义在libY.a

class foo_impl : public foo {
    void bar() { /* do something */ }
};

...并使用这两个库来链接程序-lX -lY

int main() {
    foo* my_foo = receive_a_foo_from_somewhere();
    my_foo->bar();
}

然后

  • 如何强制链接器实际链接引用的符号foo_impl::bar()
  • 正确链接时是否objdump -t program列出?foo_impl::bar()

编辑:澄清一下,我正在使用带有 gcc 或 clang 的 linux

编辑2:错过virtualbar()

编辑 4:我为缺少清晰度而道歉。问题应该是“如何强制链接器实际包含foo_impl::bar()在可执行文件中,以便在运行时解决它?”

4

2 回答 2

0

似乎至少有两种方法可以让链接器foo_impl::bar()在可执行文件中包含功能:

  1. 使用 gcc,可以-Wl,--whole-archive用来链接整个静态库——无论如何。
  2. 正如 Captain Obvlious 指出的,当foo_impl在程序中使用时,它的虚函数被标记为已被使用,因此被包含在可执行文件中。这也可能是一个无用的静态虚拟 foo_impl对象。
于 2013-05-31T20:04:28.553 回答
0

由于 bar 方法被定义为虚拟的,因此不需要静态链接。链接将在运行时根据 *my_foo 引用的对象类型动态完成。不管它是在 libX.a 还是 libY.a 中定义的。

回答您的问题如何强制链接器链接引用 foo_impl::bar() 的符号?

您不能强制链接器链接到特定的实现。链接将根据您从 receive_a_foo_from_somewhere() 获得的对象地址进行。

显然,实现应该链接到你的 exe。如果它不可用,它肯定会失败。但是你不能强制链接器链接特定的实现,

于 2013-05-28T06:39:11.767 回答