3

我正在使用带有大量项目和解决方案文件的 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 中定义的符号)的链接错误。

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

我可以添加ProjectReferecefrom Moduleto Simple,但是在每个使用 的项目中设置它很乏味Foo,并且违反了Foo. Module应该不需要知道Simple。显然,链接器需要了解Simple,但它应该能够通过遵循 ProjectReferences 来解决这个问题。

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

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

4

1 回答 1

1

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

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

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

修改%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-08-14T16:31:07.260 回答