【问题标题】:Do I actually have to link Ws2_32.lib?我真的必须链接 Ws2_32.lib 吗?
【发布时间】:2020-01-09 21:55:30
【问题描述】:

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/nf-winsock2-recv 的要求,我理解 Windows 2003 以来)

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

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 吗?

【问题讨论】:

  • /MD 此处无关。如果您需要使用 ws2_32.lib 中的函数,您需要以某种方式获取它的指针。可以通过导入它(使用与 lib 的链接)或自己解决它来完成。但是第二个,什么时候加载器可以为你做呢?

标签: c++ c winapi winsock winsock2


【解决方案1】:

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

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

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

编辑: 您还可以链接其他导入库而无需明确指定它。该项目继承自属性表(请参阅 menu: View -&gt; Other Windows -&gt; Property Manager ) 以及内置规则。您可以在项目属性中看到生成的链接器命令行。选择项目并按 alt-Enter 打开项目属性,然后导航到 Configuration Properties -&gt; Linker -&gt; 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”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多