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 的预编译头文件中
遇到这个问题我很好奇
首先,我有一个小小的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")
那么,我希望知道在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 的预编译头文件中