3

是否可以在 C/C++(或任何编译器)中专门覆盖符号?例如,有一个库a.lib,除了其他功能外,它还包含foo(). 现在,在我的程序中,我想foo()用另一个函数替换 的实现,这样任何对 的调用foo()都会直接转到我的实现,而不是a.lib.

宏不是一种选择。

在不修改源的情况下这可能a.lib吗?

4

1 回答 1

2

很可能是。

当您进行静态链接时,链接器仅在需要时才从库中加载符号。如果程序或较早的库提供了该符号,那么它将不在“需要”列表中。

如果库将该符号定义在与其他所需符号相同的“对象”中,则会出现问题。一个设计良好的库每个符号都有一个对象(基本上,每个函数都在它自己的源文件中定义,单独编译,并单独添加到库中)。一个设计不佳的库可能具有同时定义多个函数的对象(源文件),然后您必须将它们全部拉入才能得到一个。希望你没有这个问题。

对于 Linux 系统(和其他 Unix)上的动态库,事情并不是那么清楚。您可以定义该函数,它可能会被您自己的调用者使用,但库中的调用者可能仍使用库副本。这有点令人困惑。在 Windows 上,.lib文件的工作方式可能与 Linux 的文件类似.a,但.dll文件是完全不同的野兽,具有不同的混淆方式。

于 2013-07-12T14:47:08.387 回答