在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
值的默认值 –
– 或在VS2015的子树中参考 –
这是相关的,因为当你添加一个新的项目引用,你的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会显示警告:
- VS2010 GUI将显示除False之外的所有值的
false
,即使在构build项目时将其解释为true 。
更甚者:
看来 ,转换旧的解决scheme与vcproj
文件时,转换器将采取sln
中指定的旧依赖项和vcproj
项目的链接器选项的值,并实际设置每个ProjectReference
的LinkLibraryDependency
它插入到新的vcxproj
– 这就是原因之一是我认为这是一个长期的select – 我们大部分的项目都有一个可以追溯到VS2005的转换历史。