我刚刚接近 C++ 开发(来自 C# 背景),我想知道 C++ 项目设置(在 Visual Studio 中)中的库目录有什么区别:
和链接器“输入”,我还可以提供库:
这些之间有什么根本区别吗?
我刚刚接近 C++ 开发(来自 C# 背景),我想知道 C++ 项目设置(在 Visual Studio 中)中的库目录有什么区别:
和链接器“输入”,我还可以提供库:
这些之间有什么根本区别吗?
此设置在 VS2010 中有点摸索,在以前的版本中更加清晰。您在屏幕截图中显示的设置在工具 + 选项中的位置。其中显示了核心意图,它们包含由 Visual Studio 及其组件的设置确定的目录。CRT、MFC、ATL 和 SDK 库的位置。
Linker + Input + Additional Dependencies 设置是重要的设置,在那里你准确地说出链接器应该链接哪些 .lib 文件。您可以指定 .lib 文件的路径并完成。但是通常只指定 .lib 文件的名称,然后编辑 Additional Library Directories 以告诉链接器在哪里搜索这些 .lib 文件。如果 Boost 的安装位置并不总是相同,或者您想从 Boost 的一个版本切换到另一个版本,那么这很方便。
总而言之:
请注意,最后两个项目符号仅指定了目录,而不是链接器应链接的 .lib 文件。第一个项目符号指定了实际的 .lib 文件。对于 MSVC 程序员来说,总是令人困惑的是,链接器神奇地知道如何找到重要的 .lib 文件,而无需在 Additional Dependencies 设置中明确指定它们。
不幸的是,这是 Visual C++ 的非可视部分。项目可以通过两种不同的方式指定链接器应在不使用设置的情况下链接的 .lib 文件。第一个是您为启动项目而选择的项目模板。它使用项目属性表,即为项目指定默认设置的文件。您可以使用 View = Other Windows + Property Manager 来查看它们。一个重要的是“Core Windows Libraries”,它设置 Additional Dependencies 设置以链接基本的 Windows .lib 文件,这些文件是您始终需要的,例如 kernel32.lib 和 user32.lib。这些设置由您的项目“继承”。否则,如果您遇到“NoInherit”,则赋予它意义。
第二个重要的方法是#pragma 注释指令。在源代码中使用它,它注入了一个链接器指令。“lib”种类很重要,它告诉链接器链接一个 .lib 文件。除了您在链接器的 Additional Dependencies 设置中明确指定的内容之外。vc/atlmfc/include/afx.h 就是一个很好的例子。搜索“#pragma 评论”。请注意选择正确的 mfc .lib 文件的宏汤,具体取决于编译器的特定设置。MFC 需要链接的一堆额外的 Windows .lib 文件。
C++ 构建模型充满了曲折的小通道迷宫。IDE 试图让您陷入成功的深渊,但在此过程中隐藏了对获得更高层次理解的重要内容。在 C# 中没有什么不同,要知道如何使 Reverse() 扩展方法不消耗 O(n) 存储需要深入研究。
大多数(不是全部)库都带有两组文件:
头文件#included 包含在使用库的源代码中,以提供函数、类、常量或其他可能需要的声明
库文件是包含库代码的二进制代码。链接器在组装最终的可执行文件时使用这些