【问题标题】:How can I automatically link in the dependency of a dependency in VS 2010?如何在 VS 2010 中自动链接依赖项的依赖项?
【发布时间】:2012-08-01 04:07:03
【问题描述】:

我正在使用 Visual Studio 2010,其中包含大量项目和解决方案文件。但现在我发现自己对 ProjectReferences 有点依赖地狱:

  • 项目Simple 生成一个静态库。
  • 项目FooBar 依赖于Simple,并且还生成静态库。
  • 项目Module 依赖于Foo 并生成一个DLL。
  • 项目Module2 依赖于Bar 并生成一个DLL。

所以依赖树看起来像这样:

                Simple
                  |
     ____________/ \__________
     |                        |
    Foo                      Bar
     |                        |
   Module                   Module2

有了ProjectReferences,我可以让Module依赖Foo并自动链接Foo.lib。这很好用。

但是,有没有办法让Module 自动链接到Simple.lib

这似乎应该是可能的。 Module 依赖于Foo,它依赖于Simple,所以它似乎应该能够选择“链接到我的参考文献的输出和我的参考文献的参考文献”。但是我找不到任何可以让我这样做的东西。

“链接库依赖项”选项不这样做。它仅在 Foo.lib 中链接,然后我收到有关未解析的外部符号(在 Simple.lib 中定义的符号)的链接错误。

Foo->SimpleBar->Simple 的“链接库依赖关系”设置为true 一开始似乎有效,直到您有一个同时使用Foo 的项目和Bar。该设置实际上将Simple.lib 嵌入到Foo.libBar.lib 中,如果您尝试同时使用Foo.libBar.lib,则会出现“符号已定义”错误。这是正确的错误 - 我实际上不想将 Simple.lib 放在任何其他库中。

我可以将ProjectRefereceModule添加到Simple,但是在每个使用Foo的项目中设置这很繁琐,并且违反了Foo的封装。 Module 不需要知道 Simple。显然链接器需要知道Simple,但它应该能够通过遵循 ProjectReferences 来弄清楚。

这很重要:假设在维护期间,创建了一个新项目:Basic,它创建了一个静态库,Simple 依赖于Basic。现在我们必须直接或通过另一个 ProjectReference 将每个具有 ProjectReference 的单个项目更新为 Simple(在此示例中,它只有两个项目,ModuleModule2,但实际上有几十个)。这很乏味。

tl;dr 有没有办法自动链接到我的依赖项的静态库中?

【问题讨论】:

  • 这与您的要求略有不同,但我通常会在头文件中添加一个编译指示链接器注释以自动包含所需的 lib 文件。 #pragma comment(lib,"simple.lib")
  • @TheSteve,我也这样做了,但这可能会导致链接顺序依赖性问题。
  • @PermanentGuest,他试图将一个库嵌入到另一个库中。我不想那样做。我正在寻找利用 ProjectReferences 的解决方案。
  • 其实可能是stackoverflow.com/questions/6437538/vs2010-static-linking-issue的副本。这是一个 VS 错误,即“已修复”。我将安装 SP1,看看是否真的能解决它。

标签: c++ visual-studio-2010 project-reference


【解决方案1】:

显然,这是 Visual Studio 2010 中的一个错误: https://connect.microsoft.com/VisualStudio/feedback/details/638534/unresolved-externals-when-build-a-vc-project-with-chained-static-lib-dependencies#details

不幸的是,微软将该错误关闭为“已修复”——这并不完全正确。这更像是一种解决方法,但这不是我认为真正的解决方法。 (真正的修复应该是补丁或服务包,而不是需要在每台机器上手动调整)。

“修复”是执行以下操作:

修改%ProgramFiles(x86)%\MSBuild\Microsoft.cpp\v4.0\Microsoft.CPPBuild.Targets 并换行:

<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)"
 DependsOnTargets="$(CommonBuildOnlyTargets)">

<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)"
 DependsOnTargets="$(CommonBuildOnlyTargets);ResolvedLinkLib">

所以,只需将 ;ResolvedLinkLib 部分添加到该文件。然后VS会链接依赖的依赖。

【讨论】:

    猜你喜欢
    • 2012-02-02
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2021-09-29
    • 2011-12-10
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多