VC ++项目lib目录和链接器输入之间有什么区别

时间:2012-07-08 18:34:41

标签: visual-studio-2010 visual-c++

我正在接近C ++开发(来自C#背景),我想知道C ++项目设置中的库目录(在Visual Studio中)有什么区别:

enter image description here

和链接器“输入”,我也可以提供库:

这些之间有什么根本区别吗?

2 个答案:

答案 0 :(得分:1)

此设置在VS2010中有点失误,在以前的版本中更加清晰。您在屏幕截图中显示的设置存在于工具+选项中。它显示了核心意图,它们包含由Visual Studio及其组件的设置确定的目录。 CRT,MFC,ATL和SDK库的位置。

链接器+输入+附加依赖项设置是重要的设置,您可以准确地说明链接器应链接的.lib文件。您可以指定.lib文件的路径并完成。但是,您只需指定.lib文件的名称,然后编辑其他库目录以告知链接器在哪里搜索这些.lib文件并不罕见。如果Boost的安装位置并不总是相同,或者您想从一个版本的Boost切换到另一个版本,那么这很方便。

总结如下:

  • 链接器+输入+附加依赖项:添加链接所需的.lib文件
  • 链接器+常规+附加库目录:仅在未指定.libs路径时使用
  • VC ++目录:不要乱用它

请注意,最后两个项目符号仅指定目录,而不指定链接器应链接的.lib文件。第一个项目符号指定实际的.lib文件。启动MSVC程序员总是令人困惑的是,链接器神奇地知道如何找到重要的.lib文件而不在Additional Dependencies设置中明确指定它们。

不幸的是,这是Visual C ++的非可视部分。项目可以通过两种不同的方式指定链接器应链接的.lib文件,而不使用该设置。第一个是您选择用于启动项目的项目模板。它使用项目属性表,指定项目默认设置的文件。您可以使用View = Other Windows + Property Manager查看它们。一个重要的是“核心Windows库”,它设置附加依赖项设置以链接基本的Windows .lib文件,您总是需要的文件,如kernel32.lib和user32.lib。这些设置由您的项目“继承”。如果遇到过“NoInherit”,则给予其意义。

第二个重要方法是#pragma comment指令。它在源代码中使用,它注入了一个链接器指令。 “lib”变种很重要,它告诉链接器链接.lib文件。在添加中,在链接器的Additional Dependencies设置中明确指定的内容。一个非常好的例子是vc / atlmfc / include / afx.h。搜索“#pragma comment”。请注意选择正确的mfc .lib文件的宏汤,具体取决于编译器的特定设置。还有一堆MFC需要链接的额外Windows .lib文件。

C ++构建模型充满了一些曲折的小段落。 IDE试图让你陷入成功的困境,但在此过程中隐藏了进入下一级理解的重要性。在C#中没有什么不同,要知道如何使Reverse()扩展方法不消耗O(n)存储需要挖掘。

答案 1 :(得分:0)

大多数(并非所有)库都带有两组文件:

  • 头文件在使用库的源代码中是#included,提供函数,类,常量或其他可能需要的声明

  • 库文件是包含库代码的二进制代码。链接器在组装最终可执行文件时使用它们