系统准备
windows系统中装有visual studio 软件开发包。
如本教程中使用的平台是:
- windows 7 旗舰版 x64
- Microsoft Visual Studio 2013 update
libuv windows平台搭建步骤
-
下载libuv:https://github.com/libuv/libuv
打开gibhub网站后,点击Clone or download按钮后,在弹出的对话框中选择Download ZIP文件。将下载后的文件解压到磁盘中。如本人解压的磁盘为C:/libuv-1.x
。 -
下载gyp https://github.com/turbulenz/gyp 压缩包,在刚解压后的libuv根目录下创建build目录,如
C:/libuv-1.x/build
-
gyp安装需要python环境,下载Python2.x(https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi)安装.
注意选中注册python的环境变量。 -
gyp安装:cmd命令行下进入
C:/libuv-1.x/build
下,执行:setup.py install - libuv安装:执行vcbuild.bat
如系统中安装多个python版本,为避免版本中冲突,可以在命令行下先执行set PYTHON=python2.7版本的可执行文件
,如set PYTHON=C:/Python27amd64/python.exe
执行完成后,根libuv根目录下会创建如下的文件:
libuv.vcxproj
libuv.vcxproj.filters
run-benchmarks.vcxproj
run-benchmarks.vcxproj.filters
run-tests.vcxproj
run-tests.vcxproj.filters
uv.sln
windows环境下编译
如以上成功,则在libuv根目录下会创建ul.lsn等vs工程文件。如C:/libuv-1.x/uv.sln
使用vs 打开uv.lsn即可以进行debug和release的版本的编译,编译后的文件默认为.lib的静态文件。
- 打开uv.sln编译工程,可能需要修改工程的平台工具集和Window SDK版本,并以成功后会生成include目录和Debuglib下的libuv.lib
- vs创建Win32 Console工程,把include和libuv.lib复制到根目录下
- 包含头文件:右键项目->属性->C/C++->常规的附加包含目录为:include;%(AdditionalIncludeDirectories)
说明
默认的libv的代码生成方式debug为mtd,release为mtd,而我们一般创建的vs工程debug为mtd,release下为mt.所以在编译工程或测试例子时会出现错误。
详见:http://www.bytekits.com/tsingchen/libuv/libuv-windows-build.html
1>LIBCMTD.lib(invarg.obj) : error LNK2005: __invoke_watson 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(wcstombs.obj) : error LNK2005: _wcstombs 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(sprintf.obj) : error LNK2005: _sprintf 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __amsg_exit 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __cexit 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __exit 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: __initterm_e 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(wsetloca.obj) : error LNK2005: __configthreadlocale 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(vsprintf.obj) : error LNK2005: __vscprintf 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(vsnprnc.obj) : error LNK2005: __vsnprintf_s 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(winapisupp.obj) : error LNK2005: ___crtSetUnhandledExceptionFilter 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(winapisupp.obj) : error LNK2005: ___crtTerminateProcess 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(winapisupp.obj) : error LNK2005: ___crtUnhandledException 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(dosmap.obj) : error LNK2005: ___doserrno 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(dosmap.obj) : error LNK2005: __errno 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_a 已经在 MSVCRT.lib(cinitexe.obj) 中定义
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_z 已经在 MSVCRT.lib(cinitexe.obj) 中定义
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_a 已经在 MSVCRT.lib(cinitexe.obj) 中定义
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_z 已经在 MSVCRT.lib(cinitexe.obj) 中定义
1>LIBCMTD.lib(winxfltr.obj) : error LNK2005: __XcptFilter 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(mlock.obj) : error LNK2005: __lock 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(mlock.obj) : error LNK2005: __unlock 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(errmode.obj) : error LNK2005: ___set_app_type 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(_file.obj) : error LNK2005: ___iob_func 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(osfinfo.obj) : error LNK2005: __get_osfhandle 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(osfinfo.obj) : error LNK2005: __open_osfhandle 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(atox.obj) : error LNK2005: _atoi 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>LIBCMTD.lib(abort.obj) : error LNK2005: _abort 已经在 MSVCRT.lib(MSVCR120.dll) 中定义
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMTD.lib(typinfo.obj) 中定义
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已经在 LIBCMTD.lib(typinfo.obj) 中定义
1>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>LINK : warning LNK4098: 默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>C:libuv-1.xDebuglibuvtest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
所以我们可以在vs的工程/配置属性/C/C++/代码生成的运行库中修改。
关于LIBUV的教程详见:https://www.bytekits.com/libuv/