在Visual Studio中,为什么有些头文件需要链接库?

Why do some header files require libraries to be linked, in Visual Studio?

本文关键字:文件 链接 Studio Visual 为什么      更新时间:2023-10-16

我正在Visual Studio 2003 .NET中构建一个套接字程序

#include <winsock2.h>头文件,但也注意到我必须在WS2_32.lib中链接来修复无法解决的winsock函数错误。

在其他作业项目中,我只是添加了一个头文件并使用了它的函数-没有添加相应的库。

这是怎么回事?

是一些标准的头文件库已经预先链接在Visual Studio或其他东西?

谢谢!

socket函数实际上是在ws2_32.dll中实现的。为了使链接器能够找到它们,您需要将ws2_32.lib 导入库添加到项目中。注意,导入库不包含函数的实际代码,而只包含在哪里可以找到实际函数的信息(在ws2_32.dll中)。

你没有提到你所指的其他头文件,但如果它是像<string.h>这样的东西,那么它已经在MSVC运行时库中;如果是<windows.h>之类的,那么这些函数由kernel32.libuser32.libgdi32.lib等导入库提供。这些库可能已经包含在您的链接器设置中。

默认情况下,Visual Studio包含最常用的Win32 .lib文件,例如kernel32。自由,user32。自由,advapi32。自由等。对于更深奥的库,您需要自己添加.lib文件。

默认情况下,Visual Studio将链接到标准库,所以如果你包含一个头文件,那么你不需要显式地添加标准库。这对于stdio.h, iostreamstdlib.h这样的东西是正确的。

也有一些头文件,如标准模板库使用的那些(有人会在一分钟内说,它实际上只是称为"标准库",但我读过的大多数书,微软的文档也引用STL),如<vector><list>,它们定义所有的代码作为模板,被编译器扩展成完整的函数,这样它们就不需要在库中链接。

顺便说一句:还有一种自动链接库的机制。只需添加:

#pragma comment(lib, "ws2_32.lib")

在代码的某个地方。Boost使用这种技术,以便它根据编译器设置链接到正确的库构建。

这与Visual Studio无关;这就是C/c++编译的工作原理。

头文件的全部作用是声明或定义符号。函数、变量、类型定义、类等

标题可以这样写:

int SomeFunction();

是一个函数声明。为了编译使用SomeFunction的代码,必须声明SomeFunction存在。这个声明必须在使用它的代码之前

这些声明通常在头文件中。

然而,声明也是一个承诺。函数定义是使该函数工作的实际C/c++源代码。声明说,"在稍后的某个时刻,你将能够找到这个的定义。"这是你对编译器和链接器的承诺。

除非使用的所有声明都有定义,否则无法成功链接C/c++代码。其中一些定义来自您自己编译的代码,但其中一些定义来自外部库。外部库的头文件提供C/c++函数、类型等的声明。但是它们也有库文件(在vc++中,这些库文件使用.lib扩展名),这些库文件提供了这些函数的定义

如果您使用头文件中的声明,而没有链接到提供定义的库文件,则会得到链接器错误。

注意头文件也可以包含定义;c++标准库的大部分,以及Boost的大部分都是由头文件定义的。所以不包含库。库的文档应该告诉您是否有一个.lib可以链接。