在 Visual Studio 中添加对 C++ 项目的引用有啥后果?

Posted

技术标签:

【中文标题】在 Visual Studio 中添加对 C++ 项目的引用有啥后果?【英文标题】:What are consequences of adding references to C++ project in Visual Studio?在 Visual Studio 中添加对 C++ 项目的引用有什么后果? 【发布时间】:2015-06-17 04:11:49 【问题描述】:

我使用 Visual Studio 已经有一段时间了,主要为 C++ 开发。我经常需要创建包含多个模块(项目)的解决方案 - 例如实用程序库,它由几个 .dll 文件组成。

当一个模块 (A) 需要使用另一个模块 (B) 时,有一个标准模式:

    包括必需的标头。 从 B 链接输出库文件(例如,在 VS 中:项目配置 -> Linker -> Input -> Additional Dependencies -> 'B.lib')。 [可选] 设置正确的构建顺序(因此 B 在 A 之前构建)。

最近我开始玩弄 C#,因为我决定用它为我的引擎开发一些基于 GUI 的工具(它比使用 C++ 和 Qt 或 wxWidgets 等外部库要容易得多) .我了解到,在 C# 中,此类依赖项是使用“参考”设置的:

当我发现这个选项也适用于 C++ 项目时,我感到非常惊讶!

确实,在我创建示例解决方案并以这种方式设置依赖项后,一切正常,没有任何额外的配置,如“链接器输入”或其他东西。

我的问题是究竟这个选项对 C++ 项目有什么作用?我对所有利润和潜在的权衡都感兴趣。

我已经知道,它会导致来自其他项目的链接输出设置为依赖项。还要别的吗?引用模块之间可能存在一些运行时依赖关系?它如何影响生成的输出?

【问题讨论】:

项目引用自动从另一个项目的相应构建配置中获取输出(用于调试应用程序构建的调试库等)。手动设置是一项相当大的工作量。 另外,既然你提到了 DLL,是的,项目引用将同时引入构建输出,.lib 导入库和运行时的 .DLL。 【参考方案1】:

最初仅用于 C++/CLI 项目。并且做了与添加对 C# 项目的引用完全相同的事情,您选择编译项目所需的 .NET 引用程序集。

但这让很多 C++ 程序员感到困惑,他们认为它应该包含一些通常有用的东西。可能是因为它位于“通用属性”标题下。很多关于它的问题。

快进到 VS2010,一个未完成的版本。微软项目超过其预定发货日期的少数情况之一。他们有额外的 6 周时间来处理错误列表。但这还不够,应该使链接依赖项更容易的功能是 not actually implemented 或禁用。

因此,在 VS2012 中,他们决定采用不同的方式,并使 Add Reference 对原生 C/C++ 项目也有用。您总是选择一个项目引用,它需要是静态库或 DLL 项目。一个生成 .lib 文件的文件。它会自动告诉链接器链接该 .lib 文件。没有别的,它只是将 .lib 文件添加到链接器命令行。效果很好。

更新:VS2015 再次更改,它现在有一个引用节点。右键单击它以添加对另一个项目的引用。

【讨论】:

似乎比手动编辑Linker input#pragma comment 更清晰。 "... 它必须是静态库或 DLL 项目。生成 .lib 文件的项目。" -- 但是只有静态库会生成.lib文件,而DLL项目不会生成.lib文件,对吧? 确实如此,导入库。它需要由使用 DLL 的任何项目链接,以便链接器知道标识符存在于另一个可执行文件中。 @athos 通常有两种方法可以进行链接,隐式或显式。您可能正在考虑在不需要 lib 文件的地方进行显式链接,并且调用应用程序通过加载关联的符号来动态链接到 lib 文件。我相信微软不推荐显式链接,因为它是许多运行时失败的根本原因。建议使用隐式链接,它会生成一个 lib 文件,告诉调用应用程序符号与 .h 包含文件相关的位置

以上是关于在 Visual Studio 中添加对 C++ 项目的引用有啥后果?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2008 中的 C# 项目中的 C++ 项目参考

visual studio 2008 c++ 中怎样添加动态链接库?

如何用visual studio2012编c++程序?

如何在 Visual Studio (C++) 项目向导中添加/重命名配置?

如何在 C++ Visual Studio 中添加声音

在 C++ 中添加多行注释时如何在 Visual Studio 2010 中启用自动星号?