我正在使用Visual Studio 2010,其中包含大量项目和解决方案文件。但现在我发现自己对ProjectReferences有点依赖了地狱:
Simple
生成一个静态库。Foo
和Bar
取决于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
和Simple
- > Bar
参考设置“{1}}的”链接库依赖关系“似乎首先起作用,直到你有一个同时使用Simple
和Foo
的项目。该设置实际上会在Bar
和Simple.lib
中嵌入Foo.lib
,如果您尝试同时使用Bar.lib
和{{1},则会出现“已定义符号”错误}。这是正确的错误 - 我实际上并不想将Foo.lib
放在任何其他库中。
我可以将Bar.lib
从Simple.lib
添加到ProjectReferece
,但是在使用Module
的每个项目中进行设置都很繁琐,而且它违反了{{1}的封装}}。 Simple
不应该了解Foo
。显然链接器需要知道Foo
,但它应该能够通过跟随ProjectReferences来解决这个问题。
这就是为什么这很重要:假设在维护期间创建了一个新项目:Module
,它创建了一个静态库,而Simple
依赖于Simple
。现在我们必须直接或通过另一个ProjectReference更新具有Basic
到Simple
的每个项目(在此示例中,它只有两个项目,Basic
和ProjectReference
,但是现实它是几十个)。那太乏味了。
tl; dr 有没有办法自动链接我的依赖项的静态库?
答案 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将链接依赖项的依赖项。