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

C++
1601 0

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

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

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

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\

选项说明:

  • 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]$VS2017141
VC16.0$[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\

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 <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;
}

添加如下lib

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

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

END

最后更新 2022-11-13
评论 ( 0 )
OωO
隐私评论