【Windows】编译libcurl,添加openssl和zlib支持

文章目录

    • 0. 准备编译目录
    • 1. 编译zlib
      • 1.1 下载源码
      • 1.2 CMake GUI构建项目
      • 1.3 编译
      • 1.4 结果
    • 2. 编译openssl
      • 2.2 安装Strawberry Perl
      • 2.1 下载源码
      • 2.2 编译(32位)
      • 2.3 编译(64位)
    • 3. 编译curl
      • 3.1 下载源码
      • 3.2 编译(32位)
      • 3.2 编译(64位)
      • 3.3 合并多个静态库 (可选)
        • 3.3.1 (32位)
        • 3.3.1 (64位)
    • 4. 测试libcurl(C语言)
    • END

Linux版本请查看:

【Linux】编译libcurl,添加openssl和zlib支持

0. 准备编译目录

新建目录D:\dev\opensource,所有编译过程均在该目录下进行。

1. 编译zlib

官网:https://zlib.net
版本:1.2.13

1.1 下载源码

下载后解压到D:\dev\opensource目录下

【Windows】编译libcurl,添加openssl和zlib支持_第1张图片

1.2 CMake GUI构建项目

【Windows】编译libcurl,添加openssl和zlib支持_第2张图片

【Windows】编译libcurl,添加openssl和zlib支持_第3张图片

生成完成后,点击“Open Project”,打开VS2017。

1.3 编译

选中zlibstatic项目,构建zlib的静态库。(win32 release)

【Windows】编译libcurl,添加openssl和zlib支持_第4张图片


编译完成后,将在D:\Dev\opensource\zlib-1.2.13\build\Debug下生成zlibstaticd.lib文件,修改名为zlib.lib

复制到D:\CPP_INCLUDE\zlib\x86\lib目录下。

zlib.hzconf.h文件复制到D:\CPP_INCLUDE\zlib\x86\include目录下。

1.4 结果

同理构建x64 release

最终形成如下文件:

D:\CPP_INCLUDE\zlib
├─x64
│  ├─include
│  │   zconf.h
│  │   zlib.h
│  └─lib
│      zlib.lib
└─x86
    ├─include
    │   zconf.h
    │   zlib.h
    └─lib
        zlib.lib

2. 编译openssl

官网:https://www.openssl.org
版本:1.1.1q

2.2 安装Strawberry Perl

官网:https://strawberryperl.com

下载zip版本,免安装。

【Windows】编译libcurl,添加openssl和zlib支持_第5张图片

解压到某个目录,然后配置环境变量,PATH添加E:\xxx\strawberry-perl-5.32.1.1-64bit\perl\bin

【Windows】编译libcurl,添加openssl和zlib支持_第6张图片

2.1 下载源码

下载后解压。

2.2 编译(32位)

复制openssl目录到D:\dev\opensource目录下,重命名为openssl-1.1.1q-x86

【Windows】编译libcurl,添加openssl和zlib支持_第7张图片

新建安装目录D:\CPP_INCLUDE\openssl\x86

打开x86 Native Tools Command Prompt for VS 2017工具,切换到openssl源码目录。

cd "D:\Dev\opensource\openssl-1.1.1q-x86"
D:
perl Configure VC-WIN32 --release no-asm no-shared --prefix="D:\CPP_INCLUDE\openssl\x86"
nmake
nmake test   # 可选,很慢
nmake install

2.3 编译(64位)

复制openssl目录到D:\dev\opensource目录下,重命名为openssl-1.1.1q-x64

【Windows】编译libcurl,添加openssl和zlib支持_第8张图片

新建安装目录D:\CPP_INCLUDE\openssl\x64

打开x64 Native Tools Command Prompt for VS 2017工具,切换到openssl源码目录。

cd "D:\Dev\opensource\openssl-1.1.1q-x64"
D:
perl Configure VC-WIN64A --release no-asm no-shared --prefix="D:\CPP_INCLUDE\openssl\x64"
nmake
nmake test    # 可选,很慢
nmake install

3. 编译curl

官网:https://curl.se/
版本:7.85

3.1 下载源码

下载后解压到D:\CPP_INCLUDE\opensource

【Windows】编译libcurl,添加openssl和zlib支持_第9张图片

3.2 编译(32位)

打开x86 Native Tools Command Prompt for VS 2017工具,切换到D:\Dev\opensource\curl-7.85.0\winbuild目录。

nmake /f Makefile.vc mode=static VC=15 MACHINE=x86 DEBUG=no WITH_SSL=static WITH_ZLIB=static WITH_PREFIX=D:\CPP_INCLUDE\curl\x86\ SSL_PATH=D:\CPP_INCLUDE\openssl\x86\ ZLIB_PATH=D:\CPP_INCLUDE\zlib\x86\

选项说明:

  • mode=:编译静态/动态库
  • VC=<10/11/12/14/15/16>:VisualStudio版本
  • MACHINE=:生成32/64位库
  • DEBUG=:生成debug/release版本
  • WITH_SSL=:openssl的库类型
  • WITH_ZLIB=:zlib的库类型
  • WITH_PREFIX=:编译结果输出路径。必须以反斜杠\结尾
  • SSL_PATH=:openssl路径
  • ZLIB_PATH=:zlib路径

附Visual Studio版本号对照表。

VC版本 _MSC_VER宏的值 VS版本 MSVC toolset version
VC6.0 1200 VS 6.0
VC7.0 1300 VS2002
VC7.1 1310 VS2003
VC8.0 1400 VS2005 80
VC9.0 1500 VS2008 90
VC10.0 1600 VS2010 100
VC11.0 1700 VS2012 110
VC12.0 1800 VS2013 120
VC14.0 1900 VS2015 140
VC15.0 [ 1910 , 1916 ] [1910,1916] [1910,1916] VS2017 141
VC16.0 [ 1920 , 1929 ] [1920,1929] [1920,1929] VS2019 142
VC17.0 [1930,) VS2022 143

3.2 编译(64位)

打开x64 Native Tools Command Prompt for VS 2017工具,切换到D:\Dev\opensource\curl-7.85.0\winbuild目录。

nmake /f Makefile.vc mode=static VC=15 MACHINE=x64 DEBUG=no WITH_SSL=static WITH_ZLIB=static WITH_PREFIX=D:\CPP_INCLUDE\curl\x64\ SSL_PATH=D:\CPP_INCLUDE\openssl\x64\ ZLIB_PATH=D:\CPP_INCLUDE\zlib\x64\

3.3 合并多个静态库 (可选)

代码中使用libcurl库,编译的时候,需要同时链接libcurl.libzlib.liblibssl.liblibcrypto.lib4个库。

可以将这4个库文件合并为1个libcurl.lib

3.3.1 (32位)

新建文件夹D:\CPP_INCLUDE\curl\x86\lib_merge

打开x86 Native Tools Command Prompt for VS 2017工具,切换到D:\CPP_INCLUDE\curl\x86\lib_merge目录。

lib.exe D:\CPP_INCLUDE\curl\x86\lib\libcurl.lib D:\CPP_INCLUDE\openssl\x86\lib\libcrypto.lib D:\CPP_INCLUDE\openssl\x86\lib\libssl.lib D:\CPP_INCLUDE\zlib\x86\lib\zlib.lib   /out:D:\CPP_INCLUDE\curl\x86\lib_merge\libcurl.lib
3.3.1 (64位)

新建文件夹D:\CPP_INCLUDE\curl\x64\lib_merge

打开x64 Native Tools Command Prompt for VS 2017工具,切换到D:\CPP_INCLUDE\curl\x64\lib_merge目录。

lib.exe D:\CPP_INCLUDE\curl\x64\lib\libcurl.lib D:\CPP_INCLUDE\openssl\x64\lib\libcrypto.lib D:\CPP_INCLUDE\openssl\x64\lib\libssl.lib D:\CPP_INCLUDE\zlib\x64\lib\zlib.lib   /out:D:\CPP_INCLUDE\curl\x64\lib_merge\libcurl.lib

4. 测试libcurl(C语言)

#include 
#include 
#include 

#include 


struct memory {
    char* response;
    size_t size;
};

static size_t callback(void *data, size_t size, size_t nmemb, void *userp) {
    size_t realsize = size * nmemb;
    struct memory *mem = (struct memory *)userp;

    char *ptr = (char*)realloc((void*)mem->response, mem->size + realsize + 1);
    if(ptr == NULL) {
        return 0;  /* out of memory! */
    }

    mem->response = ptr;
    memcpy(&(mem->response[mem->size]), data, realsize);
    mem->size += realsize;
    mem->response[mem->size] = '\0';

    return realsize;
}

int main() {
    /* 1. 初始化 */
    CURL* curl = curl_easy_init();
    if (!curl) {
        printf("curl_easy_init failed\n");
        return 1;
    }

    struct memory chunk = {0};
    chunk.response = NULL;
    chunk.size = 0;

    /* 2. 发送请求 */
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 0L);
    curl_easy_perform(curl);

    /* 3. 查看请求返回结果 */
    printf("%s\n", chunk.response);

    /* 4. 清理 */
    if (chunk.response) {
        free(chunk.response);
        chunk.response = NULL;
        chunk.size = 0;
    }
    curl_easy_cleanup(curl);
    curl = NULL;

    return 0;
}

添加如下lib

  • ws2_32.lib
  • wldap32.lib
  • crypt32.lib
  • Normaliz.lib
  • libcurl.lib (如果已经合并,就不需要下面3个了)
  • libcrypto.lib
  • libssl.lib
  • zlib.lib

编译运行程序,输出百度首页的html说明测试通过。

END

Thanks for Reading!

转载自作者个人网站:https://blog.icrystal.top/archives/11.html

作者:iCrystal
邮箱:[email protected]
博客:https://blog.icrystal.top
GitHub: https://github.com/Leopard-C

你可能感兴趣的:(编译,C++,Windows,windows,服务器,c++,网络)