【问题标题】: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) 时,有一个标准模式:

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

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

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

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

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

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

【问题讨论】:

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

标签: c++ visual-studio visual-c++ visual-studio-2012 project-reference


【解决方案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 包含文件相关的位置
猜你喜欢
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多