当前位置:   article > 正文

【Windows】编译libcurl,添加openssl和zlib支持_libcurl 64位静态库

libcurl 64位静态库

Linux版本请查看:

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

0. 准备编译目录

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

1. 编译zlib

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

1.1 下载源码

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

在这里插入图片描述

1.2 CMake GUI构建项目

在这里插入图片描述

在这里插入图片描述

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

1.3 编译

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

在这里插入图片描述


编译完成后,将在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2. 编译openssl

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

2.2 安装Strawberry Perl

官网:https://strawberryperl.com

下载zip版本,免安装。

在这里插入图片描述

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

在这里插入图片描述

2.1 下载源码

下载后解压。

2.2 编译(32位)

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

在这里插入图片描述

新建安装目录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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.3 编译(64位)

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

在这里插入图片描述

新建安装目录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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3. 编译curl

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

3.1 下载源码

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

在这里插入图片描述

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\
  • 1

选项说明:

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

附Visual Studio版本号对照表。

VC版本_MSC_VER宏的值VS版本MSVC toolset version
VC6.01200VS 6.0
VC7.01300VS2002
VC7.11310VS2003
VC8.01400VS200580
VC9.01500VS200890
VC10.01600VS2010100
VC11.01700VS2012110
VC12.01800VS2013120
VC14.01900VS2015140
VC15.0 [ 1910 , 1916 ] [1910,1916] [1910,1916]VS2017141
VC16.0 [ 1920 , 1929 ] [1920,1929] [1920,1929]VS2019142
VC17.0[1930,)VS2022143

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\
  • 1

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
  • 1
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
  • 1

4. 测试libcurl(C语言)

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#include <curl/curl.h>


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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

添加如下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
邮箱:leopard.c@outlook.com
博客:https://blog.icrystal.top
GitHub: https://github.com/Leopard-C

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/662728
推荐阅读
相关标签
  

闽ICP备14008679号