c++ - 我真的必须链接 Ws2_32.lib 吗?

标签 c++ c winapi winsock winsock2

MSDN 上的所有 Winsock2 示例都表明我必须将 Winsock2 库静态链接为:

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

Ensure that the build environment links to the Winsock Library file ?>Ws2_32.lib. Applications that use Winsock must be linked with the Ws2_32.lib >library file. The #pragma comment indicates to the linker that the Ws2_32.lib >file is needed.

但为什么我使用它而不是简单地加载 Windows Ws2_32.dll 中的现有文件(据我所知,根据 MSDN 上的要求自 Windows 2003 起 https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-recv)

所以我可以使用这样的东西:

typedef int WSAAPI(WINAPI* recv_func)(SOCKET s, char *buf, int len, int flags);

HINSTANCE hGetProcIDDLL = LoadLibraryA("ws2_32.dll");
my_recv = (recv_func)GetProcAddress(hGetProcIDDLL, "recv");

或者我可以只使用 winsock2.h header 并使用/MD 标志编译程序:

include <winsock2.h>
//#pragma comment(lib, "ws2_32.lib")

这可能吗?我是否可以像第一个示例那样使用/MD 或动态加载 ws2_32.dll 而无需将 ws2_32.lib 静态链接到我的应用程序,因为自 Win2003 以来的所有 Windows 在 System32 文件夹中都有 ws2_32.dll?

最佳答案

ws2_32.lib 是一个导入库。它由小 stub 组成,这些 stub 将重定向到 ws2_32.dll 中的实际实现。 DLL 将在程序加载时加载。它叫做Load-Time Dynamic Linking .

您可以通过比较两个文件的大小来验证这一点。另外,您可以使用 dumpbin -symbols ws2_32.lib。它没有向您展示您可能期望从 ws2.h 原型(prototype)中获得的任何功能。

好吧,您已经在加载时动态加载了 DLL。也可以在运行时使用 LoadLibraryGetProcAddress 执行此操作。但这很麻烦,不会给您带来任何好处。

编辑: 您还可以链接其他导入库而无需明确指定。该项目继承自属性表(请参阅 菜单:查看 -> 其他窗口 -> 属性管理器 ) 以及内置规则。您可以在项目属性中看到生成的链接器命令行。选择项目并按 alt-Enter 打开项目属性,然后导航到 Configuration Properties -> Linker -> Input 以显示链接器命令行。对于 VS2017 Win32 C++ 项目,您可以找到这些导入库:

"kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib"

关于c++ - 我真的必须链接 Ws2_32.lib 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57831867/

相关文章:

c - objdump vs/proc/pid/maps 的虚拟内存地址?

c - 如何改变c中整数中数字的位置

c++ - C++中同一对象的实例(游戏编程)

c++ - 向字符串添加字符

C++ - undefined object 引用

c++ - 借助 static_assert 改进诊断

找不到我从排序数组构建平衡二叉树时的错误(段错误)

c++ - 仅允许垂直窗口调整大小的最简单方法是什么?

c - C 中的 PlaySound 发出蜂鸣声但不播放 wav 文件

c++ - 在放大镜窗口上绘制(放大 API)