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

C++
1550 0

0. 准备编译目录

新建目录~/dev/compile,所有编译过程均在该目录下进行。

mkdir -p ~/dev/compile
cd ~/dev/compile

1. 编译zlib

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

1.1 下载源码

cd ~/dev/compile
wget https://zlib.net/zlib-1.2.13.tar.gz
tar -xzf zlib-1.2.13.tar.gz
cd zlib-1.2.13

1.2 编译

编译【静态库】。

./configure --static --prefix=/usr/local/zlib
make
sudo make install

1.3 查看安装路径(头文件和库文件)

# 头文件
#   /usr/include/zlib.h
#   /usr/include/zconf.h
ls -l /usr/include | grep -e zlib.h -e zconf.h

# 静态库文件
#   /usr/lib/libz.a
ls -l /usr/lib | grep libz.a

2. 编译openssl

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

2.1 下载源码

cd ~/dev/compile
wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1q.tar.gz
tar -xzf openssl-1.1.1q.tar.gz
cd openssl-1.1.1q

# 创建可执行文件链接
sudo ln -s /usr/local/ssl/bin/openssl /usr/local/bin/openssl

2.2 编译

编译【静态库】。

./config -fPIC no-shared zlib --openssldir=/usr/local/ssl --prefix=/usr/local/ssl
make -j4
sudo make install

选项说明:

  • -fPIC:生成位置无关的代码。Position Independent Code.
  • no-shared:生成静态库,而不是动态库。
  • zlib:静态链接zlib库
  • --opernssldir:安装目录
  • --prefix:设置lib include bin目录的前缀,默认和openssldir一样。

3. 编译curl

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

3.1 下载源码

cd ~/dev/compile
wget --no-check-certificate https://curl.se/download/curl-7.85.0.tar.gz
tar -xzf curl-7.85.0.tar.gz
cd ~/dev/compile/curl-7.85.0

3.2 编译

编译【静态库】

./configure --prefix=/usr/local/curl --with-openssl=/usr/local/ssl --with-zlib=/usr/local/zlib --disable-shared
make -j4
sudo make install

# 创建可执行文件链接
sudo ln -s /usr/local/curl/bin/curl /usr/local/bin/curl
# 测试
curl -I https://www.baidu.com

选项说明

  • --prefix:curl安装目录
  • --with-openssl:支持openssl,后面是安装目录
  • --with-zlib:支持zlib,后面是zlib安装目录
  • --disable-shared:只编译静态库,不生成动态链接库。

安装目录/usr/local/curl

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

代码中使用libcurl库,编译的时候,需要同时链接libcurl.alibz.alibssl.alibcrypto.a4个库。

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

# 创建临时文件夹
cd /usr/local/curl/lib
sudo mkdir merge_lib
cd merge_lib

# 复制4个库文件到这里
sudo cp /usr/local/zlib/lib/libz.a /usr/local/ssl/lib/libcrypto.a /usr/local/ssl/lib/libssl.a /usr/local/curl/lib/libcurl.a .

# 展开所有文件
sudo ar x libz.a
sudo ar x libssl.a
sudo ar x libcrypto.a
sudo ar x libcurl.a

# 合并库文件
sudo ar r libcurl_ssl_zlib.a *.o

# 备份原来的libcurl.a文件,替换
sudo mv ../libcurl.a ../libcurl_old.a
sudo mv libcurl_ssl_zlib.a ../libcurl.a
cd ..
ls -l

4. 测试libcurl (C语言)

cd ~/dev/compile/curl-7.85.0
mkdir test_libcurl
cd test_libcurl
vim main.c

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

编译测试代码:

gcc -I/usr/local/curl/include -o out main.c -L/usr/local/curl/lib -lcurl -lpthread -ldl

运行程序:

./out

输出百度首页的html说明测试通过。

END

最后更新 2022-10-23
评论 ( 0 )
OωO
隐私评论