首页未分类 › libuv 在win10 vs各个版本编译静态库

libuv 在win10 vs各个版本编译静态库

01 环境

libuv使用git管理代码,使用gyp管理工程文件。git、python2.x必须。
环境描述:
win10x64企业版本(10.0.14393),
vs2005–vs2015,
python2.7.6,
git(version 1.9.5.chromium.6)。
git和python建议使用更高版本。
因为下载gyp管理工具需求翻墙,需要vpn。自己有美国的vps,可以自己搭建。
官网:http://libuv.org/
github源码:https://github.com/libuv/libuv

02 源码下载

命令提示符窗口输入:

cd d:\git
git clone https://github.com/libuv/libuv.git
cd libuv
git tag #查看稳定版本,当前2016-12-30 稳定版本v1.9.1
git checkout v1.9.1 -b b1.9.1  # 迁出稳定版本,并建立新分支b1.9.1

03 编译源码

03.01 获取gyp工具链

命令行提示符窗口运行vcbuild.bat,将会获得gyp工具链。

vcbuild.bat

这一布需要vpn翻墙。从vcbuild.bat脚本可以看到git clone https://chromium.googlesource.com/external/gyp build/gyp。gyp是从googlesource下载的。下载到当前目录的build子目录下。

03.02 指定使用visualStudio版本

从gyp_uv.py文件中,可以看到GYP_MSVS_VERSION这个环境变量。这是指定使用什么vs版本的。通过在命令行设置这个环境变量,指定使用系统那个vs版本。
在命令行提示符设置环境变量,设置2005到2015等,均可。

set GYP_MSVS_VERSION=2015

03.03 指定目标版本架构

从gyp_uv.py文件中,可以看到有-Dtarget_arch参数,这个是指定生成的项目是32位还是64位的。需要在命令行中指定,默认使用64位。
类似:

gyp_uv.py -Dtarget_arch=x32  # 目标文件32位
gyp_uv.py -Dtarget_arch=x64  # 目标文件64位

03.04 指定目标版本支持xp系统

如果需要支持xp系统,对于vs2012以后的版本,需要特殊指定平台工具集。即visual studio 工程的配置属性==>常规==>平台工具集选择对xp系统的支持。v140_xp(vs2015),v120_xp(vs2013),v110_xp(vs2012)。

这个属性可以在gyp文件重配置。可以配置到common.gypi中。因为每个工程都引用common.gypi。
在 common.gypi 的line86 附近加入编译对xp版本的支持。
在【’msvs_settings’: 】行前面,与msvs_settings同级。

'msbuild_toolset': 'v140_xp',  # VS2015
#'msbuild_toolset': 'v120_xp',  # VS2013
#'msbuild_toolset': 'v110_xp',  # VS2012

03.05 生成vs工程文件

使用gyp_uv.py生成工程文件,生成的工程和sln文件都在当前目录。共有7个。再次生成时,会覆盖已有文件。

libuv.vcxproj
libuv.vcxproj.filters
run-benchmarks.vcxproj
run-benchmarks.vcxproj.filters
run-tests.vcxproj
run-tests.vcxproj.filters
uv.sln

安装对应vs版本后,命令提示符cmd窗口运行如下命令,可生成对应版本的工程文件。

# 如果要支持xp,记得修改common.gypi。添加
'msbuild_toolset': 'v140_xp',  # VS2015
# 01 vs2015的x86版本
set GYP_MSVS_VERSION=2015
gyp_uv.py -Dtarget_arch=x32
# 02 vs2015的x64版本
set GYP_MSVS_VERSION=2015
gyp_uv.py -Dtarget_arch=x64

# 如果要支持xp,记得修改common.gypi。添加
'msbuild_toolset': 'v120_xp',  # VS2013
# 03 vs2013的x86版本
set GYP_MSVS_VERSION=2013
gyp_uv.py -Dtarget_arch=x32
# 04 vs2013的x64版本
set GYP_MSVS_VERSION=2013
gyp_uv.py -Dtarget_arch=x64

# 如果要支持xp,记得修改common.gypi。添加
'msbuild_toolset': 'v110_xp',  # VS2012
# 05 vs2012的x86版本
set GYP_MSVS_VERSION=2012
gyp_uv.py -Dtarget_arch=x32
# 06 vs2012的x64版本
set GYP_MSVS_VERSION=2012
gyp_uv.py -Dtarget_arch=x64

# 07 vs2010的x86版本
set GYP_MSVS_VERSION=2010
gyp_uv.py -Dtarget_arch=x32
# 08 vs2010的x64版本
set GYP_MSVS_VERSION=2010
gyp_uv.py -Dtarget_arch=x64

# 09 vs2008的x86版本
set GYP_MSVS_VERSION=2008
gyp_uv.py -Dtarget_arch=x32
# 10 vs2008的x64版本
set GYP_MSVS_VERSION=2008
gyp_uv.py -Dtarget_arch=x64

# 11 vs2005的x86版本
set GYP_MSVS_VERSION=2005
gyp_uv.py -Dtarget_arch=x32
# 12 vs2005的x64版本
set GYP_MSVS_VERSION=2005
gyp_uv.py -Dtarget_arch=x64

注意:
A:每次执行gyp_uv.py都会覆盖前次运行结果。
B:使用vs2015 可以通过指定v120_xp v110_xp 代替vs2013和vs2012编译。

03.06 vs编译libuv静态库

使用对应版本visual studio 打开对应 使用gyp_uv.py生成的 uv.sln 文件,选择debug或release版本,编译,会在当期的目录下,生成debug目录和release目录及对应的libuv.lib文件。
把 include 目录,和对应的libuv.lib文件拷贝到自己工程指定位置,即可以使用libub库功能。

03.07 问题

在win10x64 编译x86版本时,run-benchmarks和run-tests测试工程会报错,x64为版本没问题。
错误如下:

tty.c(468): warning C4013: “InterlockedOr”未定义;假设外部返回 int
测试程序用到这个函数相关的调用,出现链接错误
libuv.lib(tty.obj) : error LNK2001: 无法解析的外部符号 _InterlockedOr

03.08 工程文件存档

为了避免再次翻墙,把对应的工程文件和gyp工具链保存到github上面。
地址:https://github.com/5455945/libuv
在分支b1.9.1上(https://github.com/5455945/libuv/tree/b1.9.1)。
这个分支已经包含了gyp工具链,下载下来可以直接使用gyp_uv.py生成vs工程。

发表评论