VS2010静态链接问题

Exa*_*Exa 10 c++ linker visual-studio-2010 static-linking visual-studio

我公司最近从VS2005升级到VS2010.我们有一个庞大的项目,它使用了许多模块,这些模块被静态链接到exe中.但是VS2010中的链接似乎存在一些问题.

为了解释我们的问题,我们构建了一个最小的示例项目,其组成如下图所示:

最小的库示例

有一个应用程序使用库A中的一个函数.库A调用每个库B和库C的一个函数.这两个库调用库D提供的函数.

对于埃克1框架和参考我们设置的一切虚假除了链接库依赖其设置为true.加入的唯一引用被链接到库中的.对于每个库,所有设置都设置为false.库A仅引用对BC的引用,以及仅引用D的引用.图书馆D没有参考.

构建应用程序时,它可以正常工作.应用程序注意到库A正在使用库B和C,它们正在使用库D,所以它知道它也必须链接这些库.libs没有问题地链接到exe.

现在,我们在改变一些东西,比方说,库d.只是一点点差异,只有一个字母.现在我们尝试再次构建应用程序,它注意到更改并重新编译库D,但是:它不再链接到它.其结果是在链接错误文库BC ^,因为它们使用的库d.我们必须首先运行Rebuild,以强制完整的建筑,然后一切都再次链接.

对于最小示例以及我们的主项目,都会发生这种情况.当然,我们可以添加每个库作为exe的附加依赖项,但如果它可以像第一次构建项目时那样工作并且在代码更改后继续工作将会很好.我们注意到,当将Use Library Dependency Inputs设置为true时,它再次起作用,但是它不会链接*.lib文件,而是链接*.obj文件,这当然不是我们想要的.

有没有人提出类似的经验或有任何人解决这个问题?这是VS2010的错误行为吗?

TIA.

ps:所有库和可执行文件都是本机C++.


编辑:(从此网站获取的解决方法)

在文件中%ProgramsFile%\MSBuild\Microsoft.cpp\v4.0\Microsoft.CPPBuild.Targets有一行

<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)" DependsOnTargets="$(CommonBuildOnlyTargets)">
Run Code Online (Sandbox Code Playgroud)

如果您将该行更改为

<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)" DependsOnTargets="$(CommonBuildOnlyTargets);ResolvedLinkLib">
Run Code Online (Sandbox Code Playgroud)

链接正常工作,所有需要的库都隐式链接.链接器输出不仅显示lib_a.lib,还显示所有其他链接库lib_b,lib_c,lib_d,而不是手动添加它们作为exe的依赖项.

这似乎是一种解决方法,然后是解决方案,也许有一种实现隐式链接的正确方法.