如何在VS 2010中自动链接依赖项的依赖项

How can I automatically link in the dependency of a dependency in VS 2010?

本文关键字:依赖 链接 VS 2010      更新时间:2023-10-16

我正在使用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 中定义的符号(的链接错误。

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

我可以添加一个从ModuleSimpleProjectReferece,但是在每个使用Foo的项目中设置这很乏味,并且违反了Foo的封装。 Module应该不需要了解Simple。 显然链接器需要了解Simple,但它应该能够通过遵循项目引用来弄清楚。

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

没有办法自动链接我的依赖项的静态库?

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

不幸的是,Microsoft关闭了该错误作为"修复" - 这并不完全正确。 这更像是一种解决方法,但这不是我认为真正的解决方案。 (真正的修复是补丁或服务包,而不是需要在每台计算机上手动调整的东西(。

"修复"是执行以下操作:

修改%ProgramFiles(x86)%MSBuildMicrosoft.cppv4.0Microsoft.CPPBuild.Targets并更改行:

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

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

因此,只需添加 ;已解析链接库部分到该文件。 然后 VS 将链接依赖项的依赖项。