我实际上是否必须链接Ws2_32.lib?

时间:2019-09-07 08:07:58

标签: c++ c winapi winsock winsock2

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中的现有文件(因为据我理解,Windows 2003根据MSDN https://docs.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标头并使用/ MD标志编译程序:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

编辑: 您还可以链接其他导入库,而无需显式指定它。该项目继承自属性表(请参见 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”