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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值