我对我遇到的这个问题非常好奇。
首先,我有一个很小的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?
答案 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的预编译头中。