在Visual Studio中,为什么有些头文件需要链接库?
Why do some header files require libraries to be linked, in Visual Studio?
我正在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.lib
、user32.lib
和gdi32.lib
等导入库提供。这些库可能已经包含在您的链接器设置中。
默认情况下,Visual Studio包含最常用的Win32 .lib文件,例如kernel32。自由,user32。自由,advapi32。自由等。对于更深奥的库,您需要自己添加.lib文件。
默认情况下,Visual Studio将链接到标准库,所以如果你包含一个头文件,那么你不需要显式地添加标准库。这对于stdio.h
, iostream
和stdlib.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可以链接。
- CMake-按正确顺序将项目与C运行时对象文件链接
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 错误 VSP1011:无法获取调试信息.与 /配置文件链接器开关链接
- 将我的主输出库与测试可执行文件链接时出现问题
- CMake + Qt + GTest 文件链接
- 生成文件链接
- 使用LTO静态链接的可执行文件(链接时间优化):如何使用以前构建的库进行制作
- 生成文件链接错误
- 使用 c++ 生成文件的文件链接
- 生成文件:链接器错误
- 反转头文件/链接
- C++实现和头文件链接
- .cpp文件将不会与.h文件链接
- 将问题与多个文件链接在一起
- 编译三个C++文件.链接错误
- C++如何将我的主类与我的头文件链接起来
- 使文件链接问题 架构x86_64的未定义符号
- c++和mex文件链接错误
- 使用堆叠类生成文件链接问题
- 使用对象文件链接c++中的东西