"链接库依赖关系"链接器选项在Visual Studio 2010 - 2015及更高版本中实际执行的操作是什么?

Mar*_* Ba 54 linker dependencies projects-and-solutions visual-studio-2010 visual-c++

在VS2008之前,您可以在解决方案文件()中设置原生C++项目依赖项Project Dependencies ...,如果(默认情况下)设置链接器选项

Properties -> Linker -> General : Link Library Dependencies = Yes
Run Code Online (Sandbox Code Playgroud)

如果设置,Visual Studio Build将自动链接.lib到该项目所依赖的所有项目(DLL,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
Run Code Online (Sandbox Code Playgroud)

我很好.不是这个问题的内容.

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


仍然可能然而定义的解决方案级项目的依赖性和General链接器选项也仍然存在.但它不起作用.看到:

特别是在这里看到(随后的问题)

微软确认链接器选项不能满足世界其他人的期望,并添加以下说明:

感谢您报告此反馈.您遇到的问题是设计问题."链接库依赖关系"是一个标志,仅指示是否将库作为链接器的输入传递.它没有自动找到依赖项.作为客户,您必须按照建议手动定义依赖关系.

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

什么是"链接器的输入",实际上并没有被链接?

Han*_*ant 39

您必须为设置指定正确的值以提高清晰度:

在此输入图像描述

  • (!)我已经知道这个答案是不正确的.有关详细信息,请参阅下面我新接受的答案. (3认同)

Mar*_* Ba 13

2017重新运行.好极了.

TL; DR

此选项为每个项目引用上的实际设置默认值(a)Link Library Dependecies.如果每个项目引用都已LinkLibraryDependecies设置,那么它实际上是无意义的.

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

(a):对于所有配置(调试/发布)和平台(Win32/x64)确实应该是相同的,或者事情变得非常复杂.

血淋淋的细节

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

关键是如何将此选项插入到vcxprj文件中以及默认<ProjectReference>设置如何用于msbuild文件中的设置.

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

实际上没有实现

<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>
Run Code Online (Sandbox Code Playgroud)

虽然它似乎以某种方式与Link选项组合在一起,但这只是让你感到困惑.

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

参考文献2010中的链接库

- 或在VS2015参考的子树中 -

2015年参考文献中的Link Lib

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

...
  <ItemGroup>
    <ProjectReference Include="..\W32DynLib1\W32DynLib1.vcxproj">
      <Project>{96be134d-acb5-....-....-....bb6fe4a7}</Project>
    </ProjectReference>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

您会注意到<LinkLibraryDependecies>true|false</..>此处缺少子元素:这意味着您实际上将使用"全局"设置来设置默认值.

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

更重要的是:

  • 如果LinkLibraryDependency您的设置中完全没有此设置,则默认为true(来自Microsoft.Cpp[.Common].propsMSBuild文件夹中的文件).
  • 如果您碰巧This is not used在全局设置中具有该值,则将其解释为true.
  • 如果您有值False is the new truth!,或者No way在此设置中,它也将被构建解释为true.
  • 如果VS2015 GUI无法解释字符串,则会显示警告: 字符串值'错误是新事实!'  无法从Boolean类型转换为任何值.
  • VS2010 GUI将显示 所有值的False,除非false,即使在构建项目时将其解释为true.

还有更多:

似乎与转换旧解决方案时vcproj的文件,该转换器将在中指定的旧的依赖sln和价值vcproj项目的连接选项,以及实际设置的LinkLibraryDependency每一个ProjectReference将其插入到新的vcxproj-这就是一个原因,我认为这这是一个长期的死亡选择 - 我们的大多数项目的转换历史可以追溯到VS2005.


小智 6

在这里,您必须去项目属性 - >公共属性 - >框架和引用,然后添加对项目的新引用.然后它只能在VS 2010中使用,而不像早期版本的VS


aep*_*iet 5

这必须设置在 Properties / Common / Frameworks and References

或者,您可以在vcxproj文件中添加类似下面的内容,当然使用您引用的实际项目和该项目的uuid.

<ItemGroup>
    <ProjectReference Include="..\Cpp\Cpp.vcxproj">
        <Project>{c58574bf-9dd8-4cf8-b5b6-6551f2f3eece}</Project>
    </ProjectReference>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)