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

时间:2015-08-13 14:21:40

标签: visual-c++ linker

我对我遇到的这个问题非常好奇。

首先,我有一个很小的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,我发现没有像

这样的链接器提示
#pragma comment(lib, "ws2_32.lib")

然后,我希望知道谁告诉link.exe链接到ws2_32.lib?

1 个答案:

答案 0 :(得分:1)

以下片段取自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的预编译头中。