前言:curl目前写这边文章的时候,已经是8.8.0版本了。在win上面编译一份支持各种特性的不是特别容易。因此偷懒使用下vcpkg来编译,方便又快捷。
- 准备
- 安装git,最好有个能快速访问网络源码的工具。
- 安装visual studio,我直接装的2022,有最新的你可以直接装最新的。
- 拉取vcpkg代码,https://github.com/Microsoft/vcpkg.git 微软官方的库。如果已经有vcpkg了,那么也建议在vcpkg目录下执行下git pull。vcpkg目录里面执行bootstrap-vcpkg.bat生成vcpkg.exe。就算vcpkg安装好了。
- 编译openssl。(如果你打算使用openssl来让curl库支持https、ssl,那么要先安装下openssl,如果用win系统自带的或者mbedtls之类的,就不用编译openssl)
- 在vcpkg目录下,找到ports>openssl>windows,里面有个portfile.cmake文件,记事本打开即可,在文件前面位置(可以写在set(ENV{COMSPEC} "${cmd}") 行下面)写入新的行:set(VCPKG_CRT_LINKAGE static),当然写在最前边第一行应该也可以吧。然后保存并关闭文件。这一行主要是设置MT编译,不用带vc的运行时库那些dll了。如果你需要MD编译,那么不用加这一行。
- 命令行执行命令:vcpkg.exe install openssl:x86-windows,生成的就是32位的MT编译的openssl,一般都是最新版本的openssl3。
- 编译libpsl。这一步通常不需要做,因为新的libpsl会依赖一个巨大的icu库,没有特别需求的就不需要支持这个特性了。(主要是用来解析非英文字母数字的域名用的)。
- 在vcpkg目录下找到:ports>libpsl>portfile.cmake文件打开。在portfile.cmake文件里面写入set(VCPKG_CRT_LINKAGE static)这一行。目的同样是为了MT编译,icu那块儿如果需要也自行修改。
- 保存后,命令行执行命令:vcpkg.exe install libpsl:x86-windows
- 修改所需特性对应的依赖库的编译方式,都改为MT编译。
- 在ports目录里面,找到对应库的文件夹打开,打开后找到portfile.cmake文件,在里面前面位置加上一行set(VCPKG_CRT_LINKAGE static),保存并关闭。
- 查看curl支持的特性以及说明
- 命令行执行vcpkg.exe search curl,可以看到类似curl[brotli]这样的列表,中括号里面就是特性,后面对应的则是说明。
- 指定特性,编译curl
- 执行命令:vcpkg.exe install curl[brotli,c-ares,http2,ldap,non-http,openssl,tool,websockets,zstd]:x86-windows,中括号里面就是特性,可以用逗号分隔以同时支持多个特性。最后:x86-windows就是指要编译32位的版本,如果需要64位的,就填:x64-windows,前面提到的相应的库也要改为64位的。
- 等待编译完成,下载和编译都需要时间。
- 检查编译出来的curl是否全部都是MT编译的
- 要使用MT编译curl,那么他所依赖的库必须全部都是MT编译的,否则就失去MT编译的意义了。进入vcpkg>installed>x86-windows>bin目录,看到编译好的各种dll。
- 安装个exescope或者其他pe查看工具,用工具查看编译出来的每个dll,确保他们的导入库里面没有vcruntime,api-ms-api-ms-win-crt之类的,如果有就说明这个dll是MD编译的。
- 命令行执行vcpkg.exe list查看所有编译好的库,并使用vcpkg.exe remove来删除MD编译的库。
- 去vcpkg>ports目录里面找到那些MD编译的对应的库,找到portfile.cmake文件,打开并在前面加上set(VCPKG_CRT_LINKAGE static)这一行内容。保存并重新编译curl库。可以用vcpkg.exe install curl[brotli,c-ares,http2,ldap,non-http,openssl,tool,websockets,zstd]:x86-windows --recurse来使他重新编译需要的依赖库。
- 测试编译好的curl库
- 进入vcpkg>installed>x86-windows>tools>curl目录,可以看到有curl.exe和所需的dll。
- 命令行打开并切换到这个目录,然后输入curl.exe https://www.csdn.net,可以看到返回的网页内容,或者是看到一个openssl的报错,是证书报错,可以加上-k忽略证书错误,用curl.exe https://www.csdn.net -k,就看到正确内容了。或者curl官方源码里有个cacert.pem文件,你可以curl.exe https://www.csdn.net --cacert ./cacert.pem,来使用证书访问。
- 查看编译出来的curl支持的所有特性,可以用curl.exe --help all来查看。
最后,其实vcpkg在windows上非常好用,许多原本需要交叉编译或者跨平台编译的库,如果vcpkg支持,都可以考虑直接用vcpkg来编译。定制编译特性大致和上面的curl差不多。