由于需要在离线环境下面搭建开发环境,所有的包只能离线安装了,包括这个管理工具vcpkg的安装,也必须是离线安装。

一. 下载安装vcpkg管理工具

 这个解压后就是一个目录树,通过这些目录树对包进行管理。cmd执行bootstrap-vcpkg.bat脚本,会从网络上下载vcpkg.exe,以后的包就都通过vcpkg.exe去搜索和下载。然而离线环境显然是没法将这个.exe下载下来的(但是可以看到它要从哪里下载文件,要放到哪里,这些打印信息是有用的)。记事本打开bootstrap-vckpg.bat,发现它执行了scripts/目录下的bootstrap.ps1这个脚本。分析bootstrap.ps1,可以看到它调用了tls12-download.exe下载vcpkg.exe:

vcpkg安装Python vcpkg安装mkl_hive

 之前执行bootstrap-vcpkg.bat的报错信息,里面有vcpkg.exe的下载网址,手动下载并将其放到指定位置,并将下载指令注释掉,即可跳过下载,完成vcpkg工具的安装。

vcpkg安装Python vcpkg安装mkl_github_02

二. 使用vcpkg安装软件包

参考 中离线安装软件包,即可在没网的环境下完成开发环境搭建。可以先将待下载的软件包地址整理好,在一台有网络的电脑上下载好,放入downloads文件夹中。比如在安装apr-util时,有很多依赖包需要安装,即可将需要下载的软件包整理成为packages.txt,执行批量下载脚本,等待下载完成,拷贝到离线环境,继续安装即可。

windows批量下载脚本pkg-download.bat

@echo off
set urllist=C:\Users\Desktop\packages.txt
set dstDir=C:\Users\Desktop\packages\
setlocal enabledelayedexpansion
for /f  %%a in (%urllist%) do (
    set dst=%dstDir%%%~na
    rem ***********使用Windows自带的Edge打开下载网页下载(速度最快)*****
    rem explorer.exe "microsoft-edge:%%a"
    rem ***********使用Windows自带的bitsadmin下载(速度最慢)*****
    rem bitsadmin /rawreturn /transfer down %%a !dst!
    rem ***********使用Windows自带的certutil下载*********
    rem certutil.exe -urlcache -split -f %%a !dst!
    rem ***********使用powershell的wget下载*************
    PowerShell -Command "&{wget -Uri %%a -OutFile !dst!}"
)
pause

三. windows编译log4cxx实战

主要参考官方教程:Apache log4cxx: Build with CMake

vcpkg安装Python vcpkg安装mkl_vcpkg安装Python_03

 其中apr和apr-util可以直接利用vcpkg.exe install apr apr-util安装, 只用最后面两句指令,生成器根据安装的visual studio 版本选择:

vcpkg安装Python vcpkg安装mkl_vcpkg安装Python_04

cd vcpkg
cmake -S D:/download/Log4cxx-0.13.0 -B buildtrees\Log4cxx -G "Visual Studio 12 2013" -DCMAKE_INSTALL_PREFIX=installed
##如果编译64位项目,则:
#cmake -S D:/download/Log4cxx-0.13.0 -B buildtrees\Log4cxx -G "Visual Studio 12 2013 WIN64" -DCMAKE_INSTALL_PREFIX=installed
cmake --build buildtrees\Log4cxx --target install --config Release

如果执行上面的语句出错,提示找不到sed和zip工具,可以在vcpkg文件夹下面搜索,看看有没有,因为在安装某些软件包时,这些工具可能也会被一并安装,比如vcpkg install zziplib的时候会有zip工具。找到这些工具路径,导入到环境变量中,即可配置通过:

cmd:   set PATH=xx/xx/bin;xx/xx/lib;%PATH%

powershell:   $env:PATH+=";xx/xx/bin;xx/xx/lib"