在Visual Studio 2010中,“链接库依赖项”链接器选项实际上做了什么?

直到VS2008,您将自己的C ++项目依赖项设置在解决scheme文件( Project Dependencies ... )中,如果(默认情况下)链接程序选项

 Properties -> Linker -> General : Link Library Dependencies = Yes 

Visual Studio Build将自动链接到该项目所依赖的所有项目(DLL,LIB)的.lib文件中将“静态”链接。


注意:微软改变了VS2010中依赖关系的工作方式,现在你应该把依赖关系直接添加到项目中

 Common Properties -> Framework and References : (List of depenencies) (each lib/dll has a separate option: Project Reference Properties -> Link Library Dependencies : True|False 

我很好。 不是这个问题的关键。

(这里有一个解释: 灵活的项目对项目参考 。)


仍然可以在“解决scheme”级别上定义项目依赖关系,并且“ General链接器”选项也仍然存在。 但是它不起作用。 看到:

  • 链接库依赖不起作用?
  • Visual Studio 2010是否打破了C ++项目之间的“项目依赖关系”?
  • Visual Studio 2010不自动链接从属项目的静态库,因为它应该是应该的
    • “但奇怪的是,没有删除旧的用户界面,或以任何方式表明它不再有效”

特别是在这里看到(acutal 问题如下)

  • MS Connect错误586113:“链接库依赖关系”不起作用

微软证实,Linker Option没有做世界上其他人希望做的事情,并补充说明如下:

感谢您报告此反馈。 您遇到的问题是devise。 “链接库依赖关系”是一个标志,只能决定是否将库作为input传递给链接器。 它没有自动find依赖关系。 作为客户,您将不得不按照您的build议手动定义依赖性。

任何人都可以解释这意味着什么 ,或者更重要的一点: 在Visual Studio 2010中,“链接库依赖项”链接器选项实际上做了什么?

什么是“链接器”的input,实际上并不链接?

你必须给设置适当的价值,以澄清:

在这里输入图像说明

这里的东西是你必须去,项目属性 – >通用属性 – >框架和引用,然后添加新的引用到您的项目。 那么只有它会在VS 2010中工作,不像VS的早期版本

这必须在Properties / Common / Frameworks and References

另外,你可以在你的vcxproj文件中添加下面的东西,当然你可以使用你正在引用的实际项目和这个项目的uuid。

 <ItemGroup> <ProjectReference Include="..\Cpp\Cpp.vcxproj"> <Project>{c58574bf-9dd8-4cf8-b5b6-6551f2f3eece}</Project> </ProjectReference> </ItemGroup> 

看来你也必须设置

 <IgnoreImportLibrary>false</IgnoreImportLibrary> 

在REFERENCED项目中。

2017重新运行。 好极了。

TL; DR

此选项为每个项目参考上的实际Link Library Dependecies 设置默认值 (a) 。 如果每个项目引用都设置了LinkLibraryDependecies ,那么它实际上是没有意义的。

但是,在添加新引用时,默认情况下(在VS2010和2015中) vcxproj文件中新的<ProjectReference>元素没有设置设置,因此该选项相关,因为它为所有新添加的引用提供了默认值,只要他们的价值不被修改。

(a):所有的configuration(debugging/发布)和平台(Win32 / x64)应该是一样的,或者事情变得非常复杂。

血淋淋的细节

汉斯指出 ,VS2010 似乎并没有做任何事情。 但是,这并不意味着它实际上不被VS / MSBuild使用。

关键在于如何将此选项插入到vcxprj文件中,以及msbuild文件中<ProjectReference>设置的默认值如何工作。

链接器对话框中的设置如上所示插入为:

没有实际执行

 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> ... <ItemDefinitionGroup> <ClCompile> ... </ClCompile> <Link> ... </Link> <ProjectReference> <LinkLibraryDependencies>This option is not used by VS 2010!</LinkLibraryDependencies> </ProjectReference> ... </ItemDefinitionGroup> </Project> 

虽然它似乎Link选项组合在一起,这只是在那里混淆你。

在一个给定的vcxproj文件(或来自.props文件)时, 实际做了什么,就是在VS2010 VC设置对话框的Frameworks and References部分为每个项目依赖项设置Link Library Dependencies值的默认值

链接库中的参考2010年

– 或在VS2015的子树中参考 –

链接库在参考2015年

这是相关的,因为当你添加一个新的项目引用,你的vcxproj文件中的默认条目将如下所示:

 ... <ItemGroup> <ProjectReference Include="..\W32DynLib1\W32DynLib1.vcxproj"> <Project>{96be134d-acb5-....-....-....bb6fe4a7}</Project> </ProjectReference> </ItemGroup> 

您会注意到<LinkLibraryDependecies>true|false</..>子元素在此处缺失:这意味着您将使用“全局”设置来设置默认值。

如果您的全局设置为false (或No ),则项目引用将不会链接任何内容。 如果这是true ,它会链接进去。

更重要的是:

  • 如果此设置, LinkLibraryDependency完全从您的设置中丢失, 则默认为true (来自MSBuild文件夹中的Microsoft.Cpp[.Common].props文件)。
  • 如果您碰巧有这个值在您的全局设置中This is not used这将被解释为true
  • 如果你有价值False is the new truth! ,或者在这个设置中可能No way ,它也将被构build解释为真
  • 如果在这里不能解释string,VS2015 GUI会显示警告: 字符串值“假新是真相!”不能从Boolean类型转换为任何值。
  • VS2010 GUI将显示False之外的所有值的false ,即使在构build项目时将其解释为true

更甚者:

看来 ,转换旧的解决scheme与vcproj文件时,转换器将采取sln中指定的旧依赖项和vcproj项目的链接器选项的值,并实际设置每个ProjectReferenceLinkLibraryDependency它插入到新的vcxproj – 这就是原因之一是我认为这是一个长期的select – 我们大部分的项目都有一个可以追溯到VS2005的转换历史。