如何在VS 2010中自动链接依赖关系?

时间:2012-08-01 04:07:04

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

我正在使用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 - > FooSimple - > Bar参考设置“{1}}的”链接库依赖关系“似乎首先起作用,直到你有一个同时使用SimpleFoo的项目。该设置实际上会在BarSimple.lib中嵌入Foo.lib,如果您尝试同时使用Bar.lib和{{1},则会出现“已定义符号”错误}。这是正确的错误 - 我实际上并不想将Foo.lib放在任何其他库中。

我可以将Bar.libSimple.lib添加到ProjectReferece,但是在使用Module的每个项目中进行设置都很繁琐,而且它违反了{{1}的封装}}。 Simple不应该了解Foo。显然链接器需要知道Foo,但它应该能够通过跟随ProjectReferences来解决这个问题。

这就是为什么这很重要:假设在维护期间创建了一个新项目:Module,它创建了一个静态库,而Simple依赖于Simple。现在我们必须直接或通过另一个ProjectReference更新具有BasicSimple的每个项目(在此示例中,它只有两个项目,BasicProjectReference,但是现实它是几十个)。那太乏味了。

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

1 个答案:

答案 0 :(得分: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将链接依赖项的依赖项。