很久没接触C++方面的代码了,编译起来有些生疏,避免以后再次踩坑,所以记录一下。
我以静态方式编译了这些库,并且都使用了带有 Visual C++ Redistributable 的环境,也就是 Visual Studio 的 MT/MTd 模式。这样编译出来的程序自带 C++ 运行库,无需额外依赖

环境
- windows10 企业版
- visual studio 2015
准备文件
- curl-7.88.1 https://curl.se/download/curl-7.88.1.zip
- zlib131 https://zlib.net/zlib131.zip
- openssl1.1.1w https://codeload.github.com/openssl/openssl/tar.gz/refs/tags/OpenSSL_1_1_1w
- strawberry-perl-5.42.0.1 https://strawberryperl.com/
- nasm-3.01 https://www.nasm.us/pub/nasm/releasebuilds/3.01/
- cmake gui 4.2.0 https://cmake.org/download/
编译 openssl
首先安装一下所需工具,把 strawberry-perl 和 nasm 安装好,nasm 需要手动配置一下 path 环境变量,如下图

配置好 nasm 的环境变量后以管理员身份打开 VS2015 x64 本机工具命令提示符,来到解压后的 openssl 源码目录

编译命令
perl Configure VC-WIN64A no-shared //配置编译x64静态库 默认就是 MT/MTd
nmake //开始编译,耐心等待
nmake install //安装静态库文件
以上命令执行完毕后,编译好的 openssl 静态库文件默认是输出在 C:\Program Files\OpenSSL
编译 zlib
打开 cmake gui 程序,输入 zlib 源码路径等信息,就像下面这样

点击界面上的 Configure 按钮,会弹出一个版本选择,这里选择 vs2015 x64 即可,选好之后点击 Finish 按钮,加载完毕之后依次点击 Configure -> Generate -> Open Project 按钮,这时候会自动打开 vs2015,如下图

分别右键 [zlib] 和 [zlibstatic] 的属性,设置代码生成运行库:Release 模式选择 MT,Debug 模式选择 MTd。

设置完成后,再右键 [ALL_BUILD] ,选择 [重新生成] ,生成好之后再右键 [INSTALL] 选择 [仅重新生成 INSTALL]

然后 zlib 的静态库文件默认会输出到 C:\Program Files\zlib 下面。由于这里选的是 debug 模式,所以生成的是 debug 版本的 lib 库,还需要切换到 release 模式以同样的方式再生成一遍
编译 curl
前面的步骤与 zlib 编译操作差不多,只是需要额外设置 cmake 的一些选项
1. 开启 zlib 选项(使其支持gzip解压缩),这里就需要输入之前编译好的 zlib 库文件了,需要到带d版本的lib(调试版)和不带d的lib(发布版)

2. 取消编译共享库,取消生成 curl.exe,取消生成测试

3. 勾选 CURL_STATIC_CRT 启用MT/MTd

4. 启用openssl 功能,让 curl 支持访问 https 网站

以上所有选项设置好之后需要点击一下 Configure 按钮,点完之后的界面应该是这样的,如下图

可以看到红色背景区域(标红代表配置不成功),cmake 自动识别到了 openssl 的目录,因为 cmake 默认是去 C:\Program Files\OpenSSL 目录下查找的,恰好我们编译 openssl 输出在这了,所以不需要手动设置路径了。
由于选项背景是红色的,需要再次点击 Configure 按钮,当选项背景变白之后就代表配置成功了,然后点击 Generate 生成项目,接着点击 Open Project 打开项目

接下来的操作与之前编译 zlib 库相同:右键 ALL_BUILD 选择“重新生成”,再右键 INSTALL 选择“重新生成(仅限 INSTALL)”。默认情况下,编译完成的 curl 库将输出到 C:\Program Files\CURL ,记得 debug 版本跟 release 版本各生成一次。

至此,curl 库已成功编译完成。
最后
当你的项目引入了编译好的 libcurl 库,切换到 Debug 模式生成时,可能会收到 LNK4099 或 LNK4204 的警告,提示找不到 PDB 调试文件。
解决办法:
方法1. 在编译 libcurl 开源库时,每次切换 Debug/Release 模式前不要清理解决方案,这样 PDB 文件就会保留下来。
方法2. 先编译 libcurl 的 Release 版本,然后清理解决方案;接着编译 Debug 版本,并且不要清理。这样 PDB 文件也会保留下来
总的来说,编译 libcurl 开源库时,编译器会把 pdb 文件路径写进输出的 lib 静态库文件里面,当你的项目链接这个 lib 时,链接器会去查找 pdb,如果pdb文件不存在,那就会报这个警告。你可以使用 Visual Studio 提供的命令行工具查看 .lib 文件的内部 pdb 路径信息,命令:dumpbin /all libcurl-d.lib > libinfo.txt