gpt4 book ai didi

c++ - VS2010静态链接问题

转载 作者:可可西里 更新时间:2023-11-01 16:21:56 27 4
gpt4 key购买 nike

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

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

minimal library example

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

对于 Framework and References 下的 Exe 1 我们将所有内容都设置为 false 除了 Link Library Dependencies 这是设置为真。添加的唯一引用是链接到库 A。对于每个库,所有设置都设置为 false。库 A 仅获取对 BC 的引用,而这两个库仅获取对 D 的引用。 图书馆 D 没有引用资料。

构建应用程序时,它可以毫无问题地运行。应用程序注意到库 A 正在使用库 B 和库 C,后者正在使用库 D,因此它知道它也必须链接这些库。库链接到 exe 没有问题。

现在我们改变一些东西,比方说,库 D。只是一点点不同,只有一个字母。现在我们尝试再次构建应用程序,它注意到更改并重新编译 library D,但是:它不再链接到它。结果是 library BC 中的链接错误,因为它们使用了 library D。我们必须先运行 Rebuild,以强制完成构建,然后再次链接所有内容。

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

有没有人有过类似的经历,或者有没有人解决这个问题?这是 VS2010 的错误行为吗?

TIA。

附注:所有库和可执行文件都是 native C++。


编辑:(解决方法取自 this site)

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

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

如果将该行更改为

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

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

这似乎更像是一种变通方法而不是解决方案,也许有一种适当的方法来实现隐式链接。

最佳答案

关于c++ - VS2010静态链接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6437538/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com