【问题标题】:Visual Studio 2008 linker wants all symbols to be resolved, not only used onesVisual Studio 2008 链接器希望解析所有符号,而不仅仅是使用的符号
【发布时间】:2010-05-17 12:16:59
【问题描述】:

我们最近从 2005 年升级到 Visual Studio 2008,我认为这些错误是在那之后开始的。

在我们的解决方案中,我们有许多项目。其中许多是实用项目,或包含其他项目使用的核心功能的项目。这些的输出是在构建项目时链接到的 lib 文件,这些项目使用“项目依赖项...”选项生成最终的二进制文件。

其他项目之一---让我们称之为ResultLib---生成一个DLL,它需要核心项目中的一个函数。这个函数只使用了自己源文件中的静态函数,但是整个项目使用了很多低级的Windows函数,还导入了一个DLL---我们称之为Driver.dll。

我们的问题是,在构建 ExtLib 时,链接器会抱怨大量未解析的外部对象,例如从 Driver.dll 导出的所有函数,因为在链接时未指定其 lib 文件。如果我们尝试通过添加使用所有核心项目的其他项目使用的所有 lib 文件来解决此问题,我们生成的 ResultLib DLL 最终会导入 Driver.dll 并导出其中定义的所有函数。

我们如何告诉 Visual Studio 只尝试解析实际使用的符号?

【问题讨论】:

    标签: c visual-studio-2008 linker


    【解决方案1】:

    您的库对象文件可能不够精细。如果您访问库中的函数,则包含来自同一目标文件的任何其他函数,并且根据定义,它们调用的任何函数都需要解析。举个例子:

    我的库中有三个函数,f1、f2 和 f3。 函数 f1 和 f2 在同一个源文件中(因此最终将在同一个目标文件中)。函数 f3 在一个单独的文件中。

    如果我的应用程序调用 f3,链接器将只包含 f3 的代码。如果我的应用调用 f1 或 f2,链接器将始终包含这两个函数的代码。

    这就是为什么一些库项目最终会包含许多小源文件的原因。

    【讨论】:

    • 感谢您的回复,但我调用的函数实际上是这个 C 文件中为数不多的函数之一,并且没有其他函数调用库中的任何其他函数。
    【解决方案2】:

    好吧,看来我错误地认为链接器足够聪明,可以在最终链接之前删除未使用的符号。

    我必须做的是从构建中手动排除所有不必要的文件。对于列为 DLL 项目的依赖项的所有项目。啊。

    【讨论】:

      猜你喜欢
      • 2014-05-15
      • 1970-01-01
      • 2013-01-16
      • 2013-11-22
      • 2017-06-14
      • 2011-06-14
      • 1970-01-01
      相关资源
      最近更新 更多