libcurl with zlib 动态库 在 VS 下的编译

可能是因为我自己搜索技术的问题,没有在百度搜到什么有用的东西,还是自己动手丰衣足食来得实在。

以下内容作为成功编译的一个记录,仅供参考

Step 1: 编译 zlib

本文编写时,zlib 最新版为 1.2.11

1. 下载 zlib-1.2.11
2. 解压
3. 以管理员权限打开 CMD
4. 键入命令 "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"(我这里是VS2017 Community,请根据你的个人情况更改vcvars32.bat所在路径)
5. 打开 cmake-gui ,将 zlib 所在目录下的 CMakeLists.txt 拖到 cmake-gui 所在窗口
6. Configue,在弹出的窗口中选择好VS的版本,点击 Finish
7. 等待配置完毕后,再次点击 Configure,然后点击 Generate (注意,本例编译的是动态库,如果你要编译静态库,请手动将 CMAKE_C_FLAGS_ 开头的标识符内容中的 MD 改成 MT
8. 进入目录 zlib-1.2.11 ,打开 ALL_BUILD.vcxproj
9. 打开 VS 后,将当前配置切换为 Release,右键解决方案中的 zlib ,生成
10. 生成的 zlib 动态库已经在 zlib-1.2.11\Release 文件夹中了

Step 2: 编译 libcurl

本文编写时,libcurl 最新版为 7.54.0

1. 将 zlib-1.2.11 目录下的 zlib.hzconf.h 复制到 curl-7.54.0\lib
2. 在 curl-7.54.0 同级目录下创建 deps\lib 目录,创建好后的目录结构应该是这样:
 workspace:
  ├─curl-7.54.0
  │ └─ ……
  └─deps
    └─lib
3. 还记得编译 zlib 时,在 Release 文件夹下生成的 zlib.lib 吗?把它放到 deps\lib
4. 键入命令 "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"(我这里是VS2017 Community,请根据你的个人情况更改vcvars32.bat所在路径)
5. 切换目录到 curl-7.54.0\winbuild
6. nmake /f Makefile.vc mode=dll WITH_ZLIB=dll
7. 等着去吧。

2017-7-6更新
注意:
7.54.1 版本,zlib.lib 放入 curl-7.54.1\winbuild目录下,而不是放入 deps\lib ,具体zlib.lib需要放入的位置请查看winbuild\MakefileBuild.vc文件中的定义

Step 3: 测试 libcurl 动态库

  1. 打开项目属性:菜单 -> 项目(P) -> 属性(P)
  2. 配置属性 -> C/C++ -> 常规 -> 附加包含目录
      填入 curl-7.54.0\builds\libcurl-vc-x86-release-dll-zlib-dll-ipv6-sspi-winssl\include (根据自己实际情况填写!)
  3. 配置属性 -> C/C++ -> 代码生成 -> 运行库
      选择 多线程 DLL (/MD)
  4. 配置属性 -> 链接器 -> 常规 -> 附加库目录
      填入 curl-7.54.0\builds\libcurl-vc-x86-release-dll-zlib-dll-ipv6-sspi-winssl\lib (根据自己实际情况填写!)
  5. 配置属性 -> 链接器 -> 输入 -> 附加依赖项
    原有基础上添加(不仅是填入) libcurl.lib
  6. 保存!

Step 4: 上代码!

Visual Studio 2017 Community 测试通过

#include "stdafx.h"
#include 
#include 

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
        /* example.com is redirected, so we tell libcurl to follow redirection */
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        **curl_easy_setopt(curl_handle, CURLOPT_ACCEPT_ENCODING, "gzip");** // 启用 gzip

        curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, false);
        curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0);
        curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1L);
        curl_easy_setopt(curl_handle, CURLOPT_FORBID_REUSE, 1);
        /* Perform the request, res will get the return code */
        res = curl_easy_perform(curl);
        /* Check for errors */
        if (res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));

        /* always cleanup */
        curl_easy_cleanup(curl);
    }
    return 0;
}

最后说两句

有啥问题可以在评论区留言

你可能感兴趣的:(C++学习)