Windows环境下用nmake编译libevent


最近在将一个vc2005的工程挪到vs2019上时,遇到很多问题。
其中 libevent库 1 就报了很多错误,可能是版本太低,因此需要重新编译一份。

下面将 nmake 命令编译 libevent-2.1.8-stable 源码时遇到的各种错误及解决方法做一个总结。

一、方法总结

以下添加到环境变量中的路径以本机实际搜索到的为准

1) nmake 命令找不到

将以下路径加入环境变量 PATH
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx86\x86

2) 头文件找不到

将以下路径加入环境变量 INCLUDE
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared

3) lib库找不到

将以下路径加入环境变量 LIB
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x86
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\ucrt\x86
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\lib\x86

4) 不知道如何生成“print-winsock-errors.obj”

这是可能出现的错误
在其它版本的 libevent 源码中拷贝print-winsock-errors.c
放到以下目录
libevent-2.1.8-stable\test\print-winsock-errors.c

二、详细说明

1、nmake 和 cl 命令

  • 以管理员身份运行cmd
    CMD即命令提示符

  • 进入代码目录,敲 nmake
    可能提示以下错误(如果没有添加环境变量的话)

D:\code\libevent-2.1.8-stable>nmake
'nmake' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

  • 通过everything工具搜索 nmake.exe
    在这里插入图片描述
  • 将第4个路径(可以试试其它路径)加入环境变量 PATH
  • 新建一个 VisualStudioTools 变量
    在这里插入图片描述
  • 将变量 %VisualStudioTools% 加入到 PATH 中
    在这里插入图片描述
  • 保存环境变量后退出cmd窗口并再次打开,输入nmake命令如下则正常
D:\code\libevent-2.1.8-stable>nmake

Microsoft (R) 程序维护实用工具 14.28.29334.0版权所有 (C) Microsoft Corporation。  保留所有权利。

NMAKE : fatal error U1064: 未找到 MAKEFILE 并且未指定目标
Stop.

  • 如果没有添加环境变量,而是将 nmake.exe 拷贝到源码目录下运行,还会提示以下错误
D:\code\libevent-2.1.8-stable>nmake /f Makefile.nmake

Microsoft (R) Program Maintenance Utility Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /IWIN32-Code /IWIN32-Code/nmake /Iinclude /Icompat /DHAVE_CONFIG_H /I.  /Ox /W3 /wd4996 /nologo /c event.c buffer.c bufferevent.c bufferevent_sock.c bufferevent_pair.c listener.c evmap.c log.c evutil.c strlcpy.c signal.c bufferevent_filter.c evthread.c bufferevent_ratelim.c evutil_rand.c evutil_time.c win32select.c evthread_win32.c buffer_iocp.c event_iocp.c bufferevent_async.c
'cl' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
NMAKE : fatal error U1077: 'cl' : return code '0x1'
Stop.

这里的cl是指 cl.exe 工具,nmake 会调用 cl,而 cl.exe 与 nmake.exe 在同一个目录。
因此上述步骤中为 nmake.exe 添加环境变量时也包含了 cl.exe,当然也可以将 cl.exe 也拷贝过来。

2、各种头文件缺失

D:\code\libevent-2.1.8-stable>nmake /f Makefile.nmake

Microsoft (R) 程序维护实用工具 14.28.29334.0版权所有 (C) Microsoft Corporation。  保留所有权利。

        cl /IWIN32-Code /IWIN32-Code/nmake /Iinclude /Icompat /DHAVE_CONFIG_H /I.  /Ox /W3 /wd4996 /nologo /c event.c buffer.c bufferevent.c bufferevent_sock.c bufferevent_pair.c listener.c evmap.c log.c evutil.c strlcpy.c signal.c bufferevent_filter.c evthread.c bufferevent_ratelim.c evutil_rand.c evutil_time.c win32select.c evthread_win32.c buffer_iocp.c event_iocp.c bufferevent_async.c
event.c
event.c(31): fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory
buffer.c
buffer.c(32): fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory
bufferevent.c
bufferevent.c(31): fatal error C1083: 无法打开包括文件: “sys/types.h”: No such file or directory
bufferevent_sock.c
bufferevent_sock.c(32): fatal error C1083: 无法打开包括文件: “sys/types.h”: No such file or directory
bufferevent_pair.c
bufferevent_pair.c(29): fatal error C1083: 无法打开包括文件: “sys/types.h”: No such file or directory
listener.c
listener.c(30): fatal error C1083: 无法打开包括文件: “sys/types.h”: No such file or directory
evmap.c
evmap.c(30): fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory
log.c
log.c(44): fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory
evutil.c
evutil.c(31): fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory
strlcpy.c
strlcpy.c(37): fatal error C1083: 无法打开包括文件: “sys/types.h”: No such file or directory
signal.c
signal.c(34): fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory
bufferevent_filter.c
bufferevent_filter.c(31): fatal error C1083: 无法打开包括文件: “sys/types.h”: No such file or directory
evthread.c
evthread.c(34): fatal error C1083: 无法打开包括文件: “stdlib.h”: No such file or directory
bufferevent_ratelim.c
bufferevent_ratelim.c(30): fatal error C1083: 无法打开包括文件: “sys/types.h”: No such file or directory
evutil_rand.c
evutil_rand.c(38): fatal error C1083: 无法打开包括文件: “limits.h”: No such file or directory
evutil_time.c
evutil_time.c(31): fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory
win32select.c
win32select.c(33): fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory
evthread_win32.c
evthread_win32.c(34): fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory
buffer_iocp.c
include\event2/buffer.h(82): fatal error C1083: 无法打开包括文件: “stdarg.h”: No such file or directory
event_iocp.c
event_iocp.c(32): fatal error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory
正在生成代码...
正在编译...
bufferevent_async.c
bufferevent_async.c(36): fatal error C1083: 无法打开包括文件: “errno.h”: No such file or directory
正在生成代码...
NMAKE : fatal error U1077:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx86\x86\cl.EXE": 返回代码“0x2”
Stop.

  • 通过everything工具搜索 winsock2.h,stdarg.h, errno.h等
    C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\WinSock2.h
    C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\sys\types.h
    C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\stdlib.h
    C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\errno.h
    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\limits.h
    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\stdarg.h

    • 将以上共3个路径加入环境变量 INCLUDE
      INCLUDE环境变量

INCLUDE环境变量值

  • 保存环境变量后退出cmd窗口并再次打开,输入nmake /f Makefile.nmake
    如果还是提示 C1083: 无法打开包括文件: “winsock2.h”: No such file or directory 错误,按以上步骤找出
    头文件所在位置并加入环境变量 INCLUDE
D:\code\libevent-2.1.8-stable>nmake /f Makefile.nmake

Microsoft (R) 程序维护实用工具 14.28.29334.0版权所有 (C) Microsoft Corporation。  保留所有权利。

        cl /IWIN32-Code /IWIN32-Code/nmake /Iinclude /Icompat /DHAVE_CONFIG_H /I.  /Ox /W3 /wd4996 /nologo /c event.c buffer.c bufferevent.c bufferevent_sock.c bufferevent_pair.c listener.c evmap.c log.c evutil.c strlcpy.c signal.c bufferevent_filter.c evthread.c bufferevent_ratelim.c evutil_rand.c evutil_time.c win32select.c evthread_win32.c buffer_iocp.c event_iocp.c bufferevent_async.c
event.c
buffer.c
buffer.c(3096): warning C4244: “函数”: 从“const __int64”转换到“size_t”,可能丢失数据
buffer.c(3107): warning C4244: “函数”: 从“__int64”转换到“unsigned int”,可能丢失数据
buffer.c(3225): warning C4244:=: 从“__int64”转换到“ev_misalign_t”,可能丢失数据
buffer.c(3226): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
buffer.c(3227): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
buffer.c(3245): warning C4244: “函数”: 从“unsigned __int64”转换到“SIZE_T”,可能丢失数据
buffer.c(3251): warning C4244:=: 从“unsigned __int64”转换到“size_t”,可能丢失数据
buffer.c(3252): warning C4244:=: 从“unsigned __int64”转换到“ev_misalign_t”,可能丢失数据
buffer.c(3253): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
buffer.c(3261): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
buffer.c(3262): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
buffer.c(3266): warning C4244:+=: 从“__int64”转换到“size_t”,可能丢失数据
bufferevent.c
bufferevent_sock.c
bufferevent_pair.c
listener.c
evmap.c
log.c
evutil.c
strlcpy.c
signal.c
bufferevent_filter.c
evthread.c
bufferevent_ratelim.c
evutil_rand.c
evutil_time.c
evutil_time.c(537): warning C4244:=: 从“__int64”转换到“long”,可能丢失数据
evutil_time.c(542): warning C4244:=: 从“time_t”转换到“long”,可能丢失数据
win32select.c
evthread_win32.c
buffer_iocp.c
event_iocp.c
正在生成代码...
正在编译...
bufferevent_async.c
正在生成代码...
        lib /nologo event.obj buffer.obj bufferevent.obj bufferevent_sock.obj  bufferevent_pair.obj listener.obj evmap.obj log.obj evutil.obj  strlcpy.obj signal.obj bufferevent_filter.obj evthread.obj  bufferevent_ratelim.obj evutil_rand.obj evutil_time.obj win32select.obj evthread_win32.obj buffer_iocp.obj  event_iocp.obj bufferevent_async.obj /out:libevent_core.lib
        cl /IWIN32-Code /IWIN32-Code/nmake /Iinclude /Icompat /DHAVE_CONFIG_H /I.  /Ox /W3 /wd4996 /nologo /c event_tagging.c http.c evdns.c evrpc.c
event_tagging.c
http.c
evdns.c
evrpc.c
正在生成代码...
        lib /nologo event_tagging.obj http.obj evdns.obj evrpc.obj /out:libevent_extras.lib
        lib /nologo event.obj buffer.obj bufferevent.obj bufferevent_sock.obj  bufferevent_pair.obj listener.obj evmap.obj log.obj evutil.obj  strlcpy.obj signal.obj bufferevent_filter.obj evthread.obj  bufferevent_ratelim.obj evutil_rand.obj evutil_time.obj event_tagging.obj http.obj evdns.obj evrpc.obj win32select.obj evthread_win32.obj buffer_iocp.obj  event_iocp.obj bufferevent_async.obj /out:libevent.lib
        cd test
        "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx86\x86\nmake.exe" /F Makefile.nmake

Microsoft (R) 程序维护实用工具 14.28.29334.0版权所有 (C) Microsoft Corporation。  保留所有权利。

        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c regress.c regress_buffer.c regress_http.c regress_dns.c regress_testutils.c regress_rpc.c regress.gen.c regress_et.c regress_bufferevent.c regress_listener.c regress_util.c tinytest.c regress_main.c regress_minheap.c regress_iocp.c regress_thread.c regress_finalize.c
regress.c
regress.c(2865): warning C4013: “close”未定义;假设外部返回 int
regress.c(3185): warning C4090: “函数”: 不同的“const”限定符
regress_buffer.c
regress_buffer.c(1018): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
regress_buffer.c(1028): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
regress_http.c
regress_http.c(549): warning C4098: “http_basic_test”:void”函数返回值
regress_http.c(3330): warning C4098: “http_chunk_out_test”:void”函数返回值
regress_http.c(3376): warning C4098: “http_stream_out_test”:void”函数返回值
regress_http.c(3572): warning C4098: “http_connection_fail_test”:void”函数返回值
regress_http.c(3644): warning C4098: “http_simple_test”:void”函数返回值
regress_http.c(3801): warning C4098: “http_connection_retry_conn_address_test”:void”函数返回值
regress_http.c(3806): warning C4098: “http_connection_retry_test_impl”:void”函数返回值
regress_http.c(3810): warning C4098: “http_connection_retry_test”:void”函数返回值
regress_http.c(4477): warning C4098: “http_write_during_read_test”:void”函数返回值
regress_dns.c
regress_dns.c(618): warning C4098: “dns_search_test”:void”函数返回值
regress_dns.c(623): warning C4098: “dns_search_lower_test”:void”函数返回值
regress_testutils.c
regress_rpc.c
regress.gen.c
regress_et.c
regress_bufferevent.c
regress_listener.c
regress_util.c
tinytest.c
regress_main.c
regress_minheap.c
regress_iocp.c
regress_thread.c
regress_finalize.c
正在生成代码...
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib  regress.obj regress_buffer.obj regress_http.obj regress_dns.obj  regress_testutils.obj  regress_rpc.obj regress.gen.obj  regress_et.obj regress_bufferevent.obj  regress_listener.obj regress_util.obj tinytest.obj  regress_main.obj regress_minheap.obj regress_iocp.obj  regress_thread.obj regress_finalize.obj
LINK : fatal error LNK1181: 无法打开输入文件“ws2_32.lib”
NMAKE : fatal error U1077:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx86\x86\cl.EXE": 返回代码“0x2”
Stop.
NMAKE : fatal error U1077:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx86\x86\nmake.exe": 返回代码“0x2”
Stop.

  • 从以上打印可以看到没有再报头文件错误

3、lib 库无法打开

以上打印可以看到提示 “LINK : fatal error LNK1181: 无法打开输入文件“ws2_32.lib””

正在生成代码...
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib  regress.obj regress_buffer.obj regress_http.obj regress_dns.obj  regress_testutils.obj  regress_rpc.obj regress.gen.obj  regress_et.obj regress_bufferevent.obj  regress_listener.obj regress_util.obj tinytest.obj  regress_main.obj regress_minheap.obj regress_iocp.obj  regress_thread.obj regress_finalize.obj
LINK : fatal error LNK1181: 无法打开输入文件“ws2_32.lib”
NMAKE : fatal error U1077:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx86\x86\cl.EXE": 返回代码“0x2”
Stop.
NMAKE : fatal error U1077:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx86\x86\nmake.exe": 返回代码“0x2”
Stop.

  • 还是用everything工具搜索 ws2_32.lib
    WS2_32.Lib有4个
  • 将第4个路径加入环境变量 LIB
    如果还有类似 “LINK : fatal error LNK1181: 无法打开输入文件“ws2_32.lib” 提示,也将库文件所在目录加入环境变量 LIB

LIB环境变量

LIB环境变量值

  • 保存环境变量后退出cmd窗口并再次打开,输入nmake /f Makefile.nmake
D:\code\libevent-2.1.8-stable>nmake /f Makefile.nmake

Microsoft (R) 程序维护实用工具 14.28.29334.0版权所有 (C) Microsoft Corporation。  保留所有权利。

        cl /IWIN32-Code /IWIN32-Code/nmake /Iinclude /Icompat /DHAVE_CONFIG_H /I.  /Ox /W3 /wd4996 /nologo /c event.c buffer.c bufferevent.c bufferevent_sock.c bufferevent_pair.c listener.c evmap.c log.c evutil.c strlcpy.c signal.c bufferevent_filter.c evthread.c bufferevent_ratelim.c evutil_rand.c evutil_time.c win32select.c evthread_win32.c buffer_iocp.c event_iocp.c bufferevent_async.c
event.c
buffer.c
buffer.c(3096): warning C4244: “函数”: 从“const __int64”转换到“size_t”,可能丢失数据
buffer.c(3107): warning C4244: “函数”: 从“__int64”转换到“unsigned int”,可能丢失数据
buffer.c(3225): warning C4244:=: 从“__int64”转换到“ev_misalign_t”,可能丢失数据
buffer.c(3226): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
buffer.c(3227): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
buffer.c(3245): warning C4244: “函数”: 从“unsigned __int64”转换到“SIZE_T”,可能丢失数据
buffer.c(3251): warning C4244:=: 从“unsigned __int64”转换到“size_t”,可能丢失数据
buffer.c(3252): warning C4244:=: 从“unsigned __int64”转换到“ev_misalign_t”,可能丢失数据
buffer.c(3253): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
buffer.c(3261): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
buffer.c(3262): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
buffer.c(3266): warning C4244:+=: 从“__int64”转换到“size_t”,可能丢失数据
bufferevent.c
bufferevent_sock.c
bufferevent_pair.c
listener.c
evmap.c
log.c
evutil.c
strlcpy.c
signal.c
bufferevent_filter.c
evthread.c
bufferevent_ratelim.c
evutil_rand.c
evutil_time.c
evutil_time.c(537): warning C4244:=: 从“__int64”转换到“long”,可能丢失数据
evutil_time.c(542): warning C4244:=: 从“time_t”转换到“long”,可能丢失数据
win32select.c
evthread_win32.c
buffer_iocp.c
event_iocp.c
正在生成代码...
正在编译...
bufferevent_async.c
正在生成代码...
        lib /nologo event.obj buffer.obj bufferevent.obj bufferevent_sock.obj  bufferevent_pair.obj listener.obj evmap.obj log.obj evutil.obj  strlcpy.obj signal.obj bufferevent_filter.obj evthread.obj  bufferevent_ratelim.obj evutil_rand.obj evutil_time.obj win32select.obj evthread_win32.obj buffer_iocp.obj  event_iocp.obj bufferevent_async.obj /out:libevent_core.lib
        cl /IWIN32-Code /IWIN32-Code/nmake /Iinclude /Icompat /DHAVE_CONFIG_H /I.  /Ox /W3 /wd4996 /nologo /c event_tagging.c http.c evdns.c evrpc.c
event_tagging.c
http.c
evdns.c
evrpc.c
正在生成代码...
        lib /nologo event_tagging.obj http.obj evdns.obj evrpc.obj /out:libevent_extras.lib
        lib /nologo event.obj buffer.obj bufferevent.obj bufferevent_sock.obj  bufferevent_pair.obj listener.obj evmap.obj log.obj evutil.obj  strlcpy.obj signal.obj bufferevent_filter.obj evthread.obj  bufferevent_ratelim.obj evutil_rand.obj evutil_time.obj event_tagging.obj http.obj evdns.obj evrpc.obj win32select.obj evthread_win32.obj buffer_iocp.obj  event_iocp.obj bufferevent_async.obj /out:libevent.lib
        cd test
        "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx86\x86\nmake.exe" /F Makefile.nmake

Microsoft (R) 程序维护实用工具 14.28.29334.0版权所有 (C) Microsoft Corporation。  保留所有权利。

        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c regress.c regress_buffer.c regress_http.c regress_dns.c regress_testutils.c regress_rpc.c regress.gen.c regress_et.c regress_bufferevent.c regress_listener.c regress_util.c tinytest.c regress_main.c regress_minheap.c regress_iocp.c regress_thread.c regress_finalize.c
regress.c
regress.c(2865): warning C4013: “close”未定义;假设外部返回 int
regress.c(3185): warning C4090: “函数”: 不同的“const”限定符
regress_buffer.c
regress_buffer.c(1018): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
regress_buffer.c(1028): warning C4244:=: 从“__int64”转换到“size_t”,可能丢失数据
regress_http.c
regress_http.c(549): warning C4098: “http_basic_test”:void”函数返回值
regress_http.c(3330): warning C4098: “http_chunk_out_test”:void”函数返回值
regress_http.c(3376): warning C4098: “http_stream_out_test”:void”函数返回值
regress_http.c(3572): warning C4098: “http_connection_fail_test”:void”函数返回值
regress_http.c(3644): warning C4098: “http_simple_test”:void”函数返回值
regress_http.c(3801): warning C4098: “http_connection_retry_conn_address_test”:void”函数返回值
regress_http.c(3806): warning C4098: “http_connection_retry_test_impl”:void”函数返回值
regress_http.c(3810): warning C4098: “http_connection_retry_test”:void”函数返回值
regress_http.c(4477): warning C4098: “http_write_during_read_test”:void”函数返回值
regress_dns.c
regress_dns.c(618): warning C4098: “dns_search_test”:void”函数返回值
regress_dns.c(623): warning C4098: “dns_search_lower_test”:void”函数返回值
regress_testutils.c
regress_rpc.c
regress.gen.c
regress_et.c
regress_bufferevent.c
regress_listener.c
regress_util.c
tinytest.c
regress_main.c
regress_minheap.c
regress_iocp.c
regress_thread.c
regress_finalize.c
正在生成代码...
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib  regress.obj regress_buffer.obj regress_http.obj regress_dns.obj  regress_testutils.obj  regress_rpc.obj regress.gen.obj  regress_et.obj regress_bufferevent.obj  regress_listener.obj regress_util.obj tinytest.obj  regress_main.obj regress_minheap.obj regress_iocp.obj  regress_thread.obj regress_finalize.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-init.c
test-init.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-init.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-eof.c
test-eof.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-eof.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-closed.c
test-closed.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-closed.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-weof.c
test-weof.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-weof.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-time.c
test-time.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-time.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-changelist.c
test-changelist.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-changelist.obj
NMAKE : fatal error U1073: 不知道如何生成“print-winsock-errors.obj”
Stop.
NMAKE : fatal error U1077:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx86\x86\nmake.exe": 返回代码“0x2”
Stop.

  • 从以上打印可以看到没有再报 “无法打开输入文件“ws2_32.lib” 错误

4、“print-winsock-errors.obj”

这是可能出现的错误,libevent-2.1.8-stable 会出现该错误,libevent-2.1.12-stable不会。
其实不管这个错误提示,我们所需要的 lib 库文件在第3步中已经编译成功。
其实我们所需要的三个lib库文件已经生成

  • 那么这个 "NMAKE : fatal error U1073: 不知道如何生成“print-winsock-errors.obj” 要怎么解决呢?
    很简单,其它版本的 libevent 源码(比如 libevent-2.1.12-stable 中就有)中找一个文件复制到 libevent-2.1.8-stable\test 目录下
D:\code\libevent-2.1.8-stable\test\print-winsock-errors.c

再次编译即可,没有报错

D:\code\libevent-2.1.8-stable>nmake /f Makefile.nmake

Microsoft (R) 程序维护实用工具 14.28.29334.0版权所有 (C) Microsoft Corporation。  保留所有权利。

        cl /IWIN32-Code /IWIN32-Code/nmake /Iinclude /Icompat /DHAVE_CONFIG_H /I.  /Ox /W3 /wd4996 /nologo /c event.c buffer.c bufferevent.c bufferevent_sock.c bufferevent_pair.c listener.c evmap.c log.c evutil.c strlcpy.c signal.c bufferevent_filter.c evthread.c bufferevent_ratelim.c evutil_rand.c evutil_time.c win32select.c evthread_win32.c buffer_iocp.c event_iocp.c bufferevent_async.c
event.c
buffer.c
... ...
regress_util.c
tinytest.c
regress_main.c
regress_minheap.c
regress_iocp.c
regress_thread.c
regress_finalize.c
正在生成代码...
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib  regress.obj regress_buffer.obj regress_http.obj regress_dns.obj  regress_testutils.obj  regress_rpc.obj regress.gen.obj  regress_et.obj regress_bufferevent.obj  regress_listener.obj regress_util.obj tinytest.obj  regress_main.obj regress_minheap.obj regress_iocp.obj  regress_thread.obj regress_finalize.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-init.c
test-init.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-init.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-eof.c
test-eof.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-eof.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-closed.c
test-closed.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-closed.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-weof.c
test-weof.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-weof.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-time.c
test-time.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-time.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c test-changelist.c
test-changelist.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib test-changelist.obj
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo /c print-winsock-errors.c
print-winsock-errors.c
        cl /I.. /I../WIN32-Code /I../WIN32-Code/nmake /I../include /I../compat /DHAVE_CONFIG_H /DTINYTEST_LOCAL  /Ox /W3 /wd4996 /nologo ..\libevent.lib ws2_32.lib shell32.lib advapi32.lib print-winsock-errors.obj
        cd ..

完全清空重编要用到
nmake clean /f Makefile.nmake

三、结语

以上是在 Windows 10 系统上用 nmake 命令编译 libevent-2.1.8-stable 源码所遇到的问题的解决办法。
其它 libevent 版本或其它编译方式遇到的问题,这个教程可能不适用。


  1. libevent库有3个,分别是libevent.lib, libevent_core.lib, libevent_extras.lib ↩︎

猜你喜欢

转载自blog.csdn.net/k112358/article/details/110140996
今日推荐