Visual Studio 2010 不会自动链接来自依赖项的项目中的静态库,因为它应该是
Posted
技术标签:
【中文标题】Visual Studio 2010 不会自动链接来自依赖项的项目中的静态库,因为它应该是【英文标题】:Visual Studio 2010 not autolinking static libraries from projects that are dependencies as it should be supposed to 【发布时间】:2011-04-17 06:30:00 【问题描述】: 使用 C++ 控制台命令行项目创建新解决方案 创建一个新项目,一个 C++ 静态库 使命令行项目依赖于库 确保在 Configuration => Linker => General(默认情况下)中打开“Link Library Dependencies” Visual Studio 仍不会链接库。我该如何解决这个问题?它在 Visual Studio 2008 中工作。
【问题讨论】:
【参考方案1】:这仍然有效,但在 VS 2010 中是 changed:
“在 VS2010 中,我们不再支持定义隐式引用的项目依赖项,我们还引入了一种在项目级别定义项目依赖项的新方法。由于项目引用和项目依赖项是紧密的概念,都适用于项目,因此在项目文件中以一致的方式将它们一起表示是有意义的。正如您将在下面的 sn-ps 中看到的,项目引用定义和项目依赖项定义之间的唯一区别在于定义输出程序集的元数据包含/排除到/从主项目链接命令行。 虽然我们没有删除“项目依赖”对话框,但我们建议通过“框架和引用”对话框定义新的项目依赖。对于项目依赖项,您需要将属性页 UI 中的“引用程序集输出”属性设置为 false,对于项目引用,您需要设置为 true。"
在控制台项目上右键,选择“属性->通用属性->框架和引用->添加新引用”,添加静态库项目;还要检查右侧的“链接库依赖项”是否为真。似乎适用于调试和发布版本。你每天学习新的东西。 ;)
【讨论】:
您需要将项目添加到当前解决方案中吗?那么拥有静态库有什么意义呢? @UtkarshSinha 您“不需要”将静态库项目添加到解决方案中,但如果它不是解决方案的一部分,Visual Studio 将无法构建它。如果您有一个不属于解决方案的预构建静态库,那么整个问题都不适用于您。 我会说“M$ makes sure we need to learn something new every day” >:) 对于未来的探险者:这已在 VS2010 之后更改。右键单击解决方案资源管理器中项目中的“参考”节点并添加依赖项目。我想如果您有一个无法解决的项目,您将不得不通过 Properties->Linker->Input 手动添加 .lib 或使用共享项目。 值得注意的是,对于 MSVC 14 (2015),可以在项目的“Add->Reference...”下查看,然后单击所需的依赖项【参考方案2】:他们更改了 UI 以在 VS2010 中添加 C++ 项目依赖项,但奇怪的是,没有删除旧 UI,或者以任何方式表明它不再有效。
要在VS2010中创建依赖,需要使用“添加新引用”(可以在项目属性中找到),也可能在项目的右键菜单中(这里没有VS可以查看)
旧的“项目依赖”对话框现在基本上已经坏了。
【讨论】:
此外,该对话框还说明了一些有关 .Net 框架的信息,即使对于纯 C++ 项目也是如此。微软显然还没有对包含多个项目的解决方案进行基本的 UI 测试。这确实给人一种印象,即 Visual Studio 仅适用于 Hello, World 大小的项目。 旧的 UI 用来做两个的事情,这些已经被分开了。旧 UI 仍然编译依赖排序,项目属性现在处理链接。仅仅因为 A 需要在 B 之前编译并不意味着 B 应该与 A 链接。 VS 2017 仍然损坏!@#$!@#$!@#$ 但未删除。 JFC。 >:( @Mordachai 项目订单仍然需要它【参考方案3】:对于 MSVC 14(2015 版),右键单击项目,然后 "Add->Reference..."
并检查所有需要的依赖项。
是的,它在 2010 和 2015 版本之间发生了变化。好玩!
如果您要链接包含资源的项目 - 您需要直接在链接器输入依赖项列表(项目的属性对话框)中指定 .res
文件,因为它不会被以上配置。
更新
MSVC 2017 中的行为仍然相同(新)
【讨论】:
只是让大家知道这也适用于 MSVC 2017。【参考方案4】:我相信旧的 UI(依赖项)会影响 Visual Studio 的构建顺序,当从 IDE 中构建时,以获取信息。新的项目配置系统将引用嵌入到每个项目文件中,以便您可以从 IDE 外部构建(而在以前的版本中,您不能,因为您不会获得依赖项的自动链接,因为依赖项仅在解决方案级别完成)。
新系统中更复杂的项目也存在一些问题;具体来说,所有生成的二进制项目都需要明确引用每个依赖库才能正确构建,而以前它们可以有效地从其他依赖库继承。但同样的根本原因。
【讨论】:
以上是关于Visual Studio 2010 不会自动链接来自依赖项的项目中的静态库,因为它应该是的主要内容,如果未能解决你的问题,请参考以下文章
在visual studio 2010中为新的QOBJECT文件生成MOC
Visual Studio 2012 项目不会在 2010 年打开
使用 Visual Studio 2010 将 libexif 编译为静态库 - 然后从 Visual C++ 项目链接