在 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++ 中怎样添加动态链接库?