【问题标题】:Linking against two lib files that have the same function signature?链接两个具有相同函数签名的 lib 文件?
【发布时间】:2014-12-31 16:08:14
【问题描述】:

如果我使用的函数具有以下签名:

void foo(int i);

而且这个函数存在于 libxxx.lib 和 libyyy.lib 中(但是每个 lib 文件中函数的实现都不同),那么如果我将我的目标文件链接到这两个 lib 文件会发生什么?我会得到一个函数存在于两个 lib 文件中的错误,还是链接器会选择一个随机函数或其他东西?

【问题讨论】:

  • 链接器如何选择随机函数?这没有意义。
  • 听起来你需要开始使用命名空间了。
  • 是c还是c++,你应该选择一个,因为它们是不同的。
  • 一个问题……你为什么不试试呢?有三个选项。链接器错误,将使用最后一个符号,将使用第一个符号。
  • @luk32:实际上还有第四种选择:它的行为将无法预测。更糟糕的是,这似乎是可以预测的,但在未来的某个时候会中断。

标签: c windows static-libraries static-linking


【解决方案1】:

通常,链接器应该只从静态库中获取未解析的符号。因此,如果函数void foo(int i) 是从提供给链接器的一个目标文件中调用的,它将使用命令行中给出的第一个库中存在的版本。因为一旦在第一个库中找到了符号,在查看第二个库时它就不再是未解析的。

如果在两个目标文件中定义相同的符号会有所不同,因为它会导致链接器错误。

如果从另一个静态库中调用函数void foo(int i),则问题很难解决,因为现在它取决于3个库的相对顺序。我的建议是,如果可以的话,你应该避免这种极端情况。

【讨论】:

  • 如果函数在两个目标文件中定义,并且如果这两个函数被定义为“全局可见”,那么将导致链接器错误,但是如果一个或两个函数被定义为“静态” ' 那么没有链接器错误
  • IIRC,在命令行上,Microsoft 的链接器允许您将静态库指定为库(即,仅在需要时添加)或源文件之一(其中无论如何添加它)。如果您为首选库执行后者,我相信它应该确保使用正确的函数。 (OTOH,我不确定您将如何配置 Visual Studio 以生成正确的命令行。)
猜你喜欢
  • 2018-01-14
  • 2021-03-09
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多