ARM交叉编译libcurl及使用

ARM交叉编译libcurl及使用

一、编译

编译环境:x86_64 linux环境
运行环境:arm_32_linux
编译器:arm-hisiv400-linux-gcc
源码:
编译libcurl需要先编2个依赖库openssl和zlib。源码都是从官网下载的最新release的版本。
lincurl:https://curl.se/
zlib:https://zlib.net/
openssl:https://www.openssl.org/

1.openssl编译

版本:openssl-1.1.1k
编译器:arm-hisiv400-linux-gcc

./config no-asm shared --prefix=/home/wangsiyao/openssl/
vi Makefile
# 修改CROSS_COMPILE=arm-hisiv400-linux-
# 删除所有的-m64
make
make install
2. zlib编译

版本:1.2.11
编译器:arm-hisiv400-linux-gcc

./configure --prefix=/home/wangsiyao/zlib/
vi Makefile
# 修改 AR=arm-hisiv400-linux-ar
# 修改 RANLIB=arm-hisiv400-linux-ranlib
# 总之把所有的gcc都改成arm-hisiv400-linux-gcc
make
make install
3.libcurl编译

版本:curl-7.77.0
编译器:arm-hisiv400-linux-gcc

./configure --prefix=/home/wangsiyao/libcurl/ --host=arm-hisiv400-linux CC=arm-hisiv400-linux-gcc --with-openssl=/home/wangsiyao/openssl/ --with-zlib=/home/wangsiyao/zlib/ --enable-shared=0
make
make install

二、API

curl_easy_init()

描述:

此函数必须是要调用的第一个函数,它返回一个 CURL 简易句柄,您必须将其用作简易界面中其他函数的输入。当操作完成时,这个调用必须有一个对应的curl_easy_cleanup调用。
如果您还没有调用curl_global_init,curl_easy_init会自动调用。这在多线程情况下可能是致命的,因为curl_global_init不是线程安全的,并且可能会因为没有相应的清理而导致资源问题。
强烈建议您通过正确调用curl_global_init来不允许这种自动行为。该函数的使用方法详见libcurl (3)中全局环境要求的描述。

返回值:

如果此函数返回 NULL,则说明出了点问题,您无法使用其他 curl 函数。

例子:
CURL *curl = curl_easy_init();
if(curl) {
  CURLcode res;
  curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
  res = curl_easy_perform(curl);
  curl_easy_cleanup(curl);
}

curl_easy_cleanup()

#include <curl/curl.h>
void curl_easy_cleanup(CURL * handle );
描述:

此函数必须是调用简单会话的最后一个函数。它与curl_easy_init函数相反,必须使用与curl_easy_init调用返回的输入相同的句柄来调用。
这可能会关闭此句柄使用过的所有连接,并且可能一直保持打开状态 - 除非它在进行传输时连接到多句柄。如果您打算传输更多文件,请不要调用此函数,重用句柄是使用 libcurl 获得良好性能的关键。
有时,您可能会从curl_easy_cleanup 中调用进度回调或标头回调(如果之前使用curl_easy_setopt为句柄设置)。就像 libcurl 决定关闭连接并且协议是一种在断开连接之前需要命令/响应序列的协议。此类协议的示例是 FTP、POP3 和 IMAP。
在此函数被调用并返回后,对该句柄的任何使用都是非法的。curl_easy_cleanup 会杀死句柄和与之相关的所有内存!
在handle 中传入一个 NULL 指针将使这个函数立即返回而不采取任何行动。

例子:
CURL *curl = curl_easy_init();
if(curl) {
  CURLcode res;
  curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
  res = curl_easy_perform(curl);
  curl_easy_cleanup(curl);
}

curl_easy_setopt()

#include <curl/curl.h>
CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
描述:

curl_easy_setopt用于告诉 libcurl 如何表现。通过设置适当的选项,应用程序可以更改 libcurl 的行为。所有选项都使用一个选项后跟一个参数来设置。该参数可以是long、函数指针、对象指针或curl_off_t,具体取决于特定选项的期望。请仔细阅读本手册,因为错误的输入值可能会导致 libcurl 表现不佳!您只能在每个函数调用中设置一个选项。典型的应用程序在设置阶段使用许多curl_easy_setopt调用。
使用此函数调用设置的选项对于使用此句柄执行的所有即将进行的传输都有效。选项不会在传输之间以任何方式重置,因此如果您希望具有不同选项的后续传输,则必须在传输之间更改它们。您可以选择使用curl_easy_reset将所有选项重置回内部默认值。
作为 ‘char *’ 参数传递给 libcurl 的字符串由库复制;因此,在curl_easy_setopt返回后,与指针参数关联的字符串存储可能会被覆盖。此规则的唯一例外实际上是CURLOPT_POSTFIELDS,但是复制字符串CURLOPT_COPYPOSTFIELDS的替代方法具有一些您需要阅读的使用特征。此函数不接受长度超过CURL_MAX_INPUT_LENGTH (8 MB) 的输入字符串。
设置选项的顺序无关紧要。
在 7.17.0 版本之前,不会复制字符串。相反,用户被迫保持它们可用,直到 libcurl 不再需要它们。

具体设置选项可参照官网。

curl_easy_perform()

#include <curl/curl.h>
CURLcode curl_easy_perform(CURL * easy_handle );
描述:

在curl_easy_init和所有curl_easy_setopt调用完成后调用此函数,并将按照选项中的描述执行传输。它必须与同被称为easy_handle作为输入作为curl_easy_init调用返回。
curl_easy_perform以阻塞方式执行整个请求,并在完成或失败时返回。对于非阻塞行为,请参阅curl_multi_perform。
您可以在使用相同的easy_handle 的同时对curl_easy_perform进行任意数量的调用。如果您打算传输多个文件,我们甚至鼓励您这样做。然后,libcurl 将尝试为后续传输重新使用相同的连接,从而使操作更快、CPU 占用更少并使用更少的网络资源。请注意,您必须在调用之间使用curl_easy_setopt来为以下 curl_easy_perform 设置选项。
您绝不能使用相同的easy_handle从两个地方同时调用此函数。让函数先返回,然后再调用它。如果你想要并行传输,你必须使用几个 curl easy_handles。
虽然easy_handle被添加到多句柄中,但curl_easy_perform不能使用它。

返回值:

CURLE_OK (0) 表示一切正常,非零表示发生了<curl/curl.h>定义的错误- 请参阅libcurl-errors。如果CURLOPT_ERRORBUFFER是用curl_easy_setopt设置的,当返回非零值时,错误缓冲区中将出现可读错误消息

curl_easy_getinfo()

#include <curl/curl.h>
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... );
描述:

使用此函数从 curl 会话请求内部信息。第三个参数必须是指向 long 的指针、指向 char * 的指针、指向 struct curl_slist * 的指针或指向 double 的指针(如本文档进一步描述的那样)。指向的数据将被相应地填充,并且只有在函数返回CURLE_OK时才可以依赖。如果要获取传输相关数据,请在执行传输后使用此功能。
除非在下面明确提到,否则不应释放此函数返回的内存。
可提取的信息可以在官网查手册。

返回值:

如果操作成功,则返回CURLE_OK。否则将返回适当的错误代码。

其它接口

curl_version() // returns a pointer to the libcurl version string
curl_getdate() // converts a date string to time_t
curl_mime_init() //... and family, to build multipart form-data posts
curl_formadd() // (old-style) build multipart form-data posts
curl_slist_append() // builds a linked list
curl_slist_free_all() // frees a whole curl_slist as made with curl_slist_append()
curl_easy_escape() // URL encodes a string
curl_easy_unescape() // URL decodes a string

三、测试代码

#include "./libcurl/include/curl/curl.h"
#include "./libcurl/include/curl/easy.h"
#include "./libcurl/include/curl/urlapi.h"
#include <stdio.h>

int main()
{
    CURL *curl;
    CURLcode res = CURLE_OK;
    char URL[64] = "http://www.atoolbox.net/Tool.php?Id=809";
    long response_code;

    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();
    if(curl) {
        CURLU *u = curl_url();
        if(u) {
            curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
            curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
            curl_url_set(u, CURLUPART_URL, URL, 0);
            curl_easy_setopt(curl, CURLOPT_CURLU, u);
            res = curl_easy_perform(curl);

            fprintf(stderr, "****************************** Do it again\n");
            res = curl_easy_perform(curl);
            printf("\n\n\nres:%d\n\n\n", res);

            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
            printf("\n-----response-code:%ld-----\n");
            curl_url_cleanup(u);
        }
        curl_easy_cleanup(curl);
      }
    curl_global_cleanup();
    return 0;
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 ARM 平台上进行 libcurl交叉编译,您可以按照以下步骤进行操作: 1. 安装交叉编译工具链:首先,您需要安装针对 ARM 平台的交叉编译工具链。这个工具链包含了针对 ARM 架构的编译器和相关工具。您可以从工具链供应商或者开发板厂商的官方网站上获取适用于您的平台的工具链,并按照其提供的说明进行安装。 2. 下载 libcurl 源代码:您可以从 libcurl 的官方网站上下载适用于 ARM 平台的 libcurl 源代码。 3. 配置 libcurl 编译选项:解压缩 libcurl 源代码后,进入源代码目录,并执行以下命令进行配置: ``` ./configure --host=<交叉编译工具链前缀> ``` `<交叉编译工具链前缀>` 是您安装的交叉编译工具链的前缀,例如 arm-linux-gnueabihf、aarch64-linux-gnu 等。 4. 编译 libcurl:配置完成后,执行 `make` 命令开始编译 libcurl。 5. 安装 libcurl编译完成后,执行 `make install` 命令将 libcurl 安装到指定的目录中。 6. 在交叉编译环境中使用 libcurl:将交叉编译后的 libcurl 库文件和头文件复制到交叉编译环境中。然后,在您的项目中配置交叉编译工具链的路径和 libcurl 的路径,并链接 libcurl 库。 7. 进行交叉编译使用交叉编译工具链对您的项目进行编译。确保在编译过程中正确链接 libcurl 库,并将生成的可执行文件拷贝到 ARM 平台上进行测试和部署。 请注意,具体的步骤可能会因您的目标平台和工具链而有所不同。建议参考相关文档和资源以获取更详细的信息。 希望对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值