Visual C++ 链接器,ws2_32.lib 在哪里被绘制?

Visual C++ linker, where does ws2_32.lib got drawn in?

遇到这个问题我很好奇

首先,我有一个小小的tsocket.cpp

#include <Winsock2.h>

int main()
{
     SOCKET s = 0;
     closesocket(s);
     return 0;
}

使用 Visual Studio 2013 编译时,

cl /DUNICODE /DWINVER=0x501 tsocket.cpp

链接失败:

tsocket.obj : error LNK2019: unresolved external symbol __imp__closesocket@4 referenced in function _main
tsocket.exe : fatal error LNK1120: 1 unresolved externals

但是当我在第一行添加时

#include <afx.h>

链接成功。

我预处理 tsocket.h (cl /P) 并检查 tsocket.i ,我发现没有像

这样的 linker 提示
#pragma comment(lib, "ws2_32.lib")

那么,我希望知道在ws2_32.lib中谁告诉link.exe到link?

以下片段摘自 VS2015 输出。首先,将链接器设置为 /VERBOSE,以获得 -

...
          Loaded mfcs140ud.lib(nolib.obj)
1>  Processed /DEFAULTLIB:atls.lib
1>  Processed /DEFAULTLIB:ole32.lib
1>  Processed /DEFAULTLIB:oleaut32.lib
1>  Processed /DEFAULTLIB:wininet.lib
1>  Processed /DEFAULTLIB:ws2_32.lib     <---- !
1>  Processed /DEFAULTLIB:mswsock.lib
1>   Processed /DISALLOWLIB:nafxcwd.lib 
...

需要研究的提示 mfcs140ud.lib。接下来打开 VS 命令提示符,cd 到 %VSDIR%\vc\atlmfc\lib 并键入

dumpbin /directives mfcs140ud.lib > c:\temp.txt

得到(在temp.txt):

Dump of file mfcs140ud.lib

File Type: LIBRARY

   Linker Directives
   -----------------
   /DEFAULTLIB:uuid.lib
   /DEFAULTLIB:uuid.lib

   Linker Directives
   -----------------
   /include:??3@YAXPAX@Z
   /DEFAULTLIB:uuid.lib
   /DEFAULTLIB:uuid.lib
   /DEFAULTLIB:uuid.lib
   /DEFAULTLIB:atls.lib
   /merge:ATL=.rdata
   /DEFAULTLIB:kernel32.lib
   /DEFAULTLIB:user32.lib
   /DEFAULTLIB:advapi32.lib
   /DEFAULTLIB:ole32.lib
   /DEFAULTLIB:shell32.lib
   /DEFAULTLIB:oleaut32.lib
   /DEFAULTLIB:uuid.lib
   /DEFAULTLIB:shlwapi.lib
   /DEFAULTLIB:uuid.lib
   /DEFAULTLIB:wininet.lib
   /DEFAULTLIB:ws2_32.lib    <---------!

如果随附的 mfc 源代码足够完整,可以查明执行 #pragma 注释 (ws2_32) 的确切源代码,那就太好了,但现在看来并非如此。我能看到的最接近的是

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

在 sockcore.cpp.


编辑:确切的来源在 %VSDIR%\vc\atlmfc\include\atlsocket.h 中。您可以找到

这一行
#pragma comment(lib, "ws2_32.lib") 

那里 - 它通过 %VSDIR%\vc\atlmfc\include\stdafx.h.

间接包含在 mfc 的预编译头文件中