c++ - 我真的必须链接 Ws2_32.lib 吗?
问题描述
MSDN 上的所有 Winsock2 示例都表明我必须将 Winsock2 库静态链接为:
#pragma comment(lib, "ws2_32.lib")
确保构建环境链接到 Winsock 库文件 ?>Ws2_32.lib。使用 Winsock 的应用程序必须与 Ws2_32.lib >library 文件链接。#pragma 注释向链接器指示需要 Ws2_32.lib > 文件。
但是为什么我使用它而不是简单地加载 Windows Ws2_32.dll 中的现有文件(因为我根据 MSDN https://docs.microsoft.com/en-us/windows/win32/api/winsock2/的要求了解 Windows 2003 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 头文件并编译带有 /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
是一个导入库。它由小存根组成,这些存根将重定向到 ws2_32.dll 中的实际实现。DLL 将在程序加载时加载。它被称为加载时动态链接。
您可以通过比较两个文件的大小来验证这一点。您可以使用额外dumpbin -symbols ws2_32.lib
的 . 它没有向您展示您可能期望从 ws2.h 原型中获得的任何功能。
好吧,您已经在加载时动态加载了 DLL。也可以在运行时使用LoadLibrary
和执行此操作GetProcAddress
。但这很麻烦,并且不会给您带来任何好处。
编辑:
您还链接其他导入库而不明确指定它。该项目继承自属性表(请参阅 参考资料
menu: View -> Other Windows -> Property Manager
)以及内置规则。您可以在项目属性中看到生成的链接器命令行。选择项目并按 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”
推荐阅读
- javascript - SailsJS - 无法加载静态文件
- swift - Cocoapod “pod spec lint” CompileSwift 返回了一个不成功的退出代码
- julia - 在 Julia 中运行最小均方函数
- java - 如何在某个光标位置移动窗口中的图形对象?
- javascript - Enter 按键在 Safari 浏览器中不起作用
- java - JPARepository 搜索查询返回 null
- matlab - Matlab /等待栏/进度条/GUI
- r - 在 R 中,如何使用具有定义数量的集群和每个集群内的观察值的集群抽样来重新采样以准备引导?
- rust - 如何更改采用多个值的 clap 参数中的值的名称?
- php - 基于可变数据,将一行数据带到不同的页面