gpt4 book ai didi

c - 动态链接 LibCURL 时出错

转载 作者:行者123 更新时间:2023-11-30 17:26:00 24 4
gpt4 key购买 nike

我正在尝试动态链接 libcurl,但在 easy_performing 时出现段错误。
以下是全局范围声明:

#define LIBCURL_PATH_64      "/usr/lib64/libcurl.so"
void *hLibCurl = NULL;
CURL *curl;
CURL* (*curl_easy_init)(void);
CURLcode (*curl_easy_setopt)(CURL *, CURLoption, ...);
CURLcode (*curl_easy_perform)(CURL *);
const char* (*curl_easy_strerror)(CURLcode);
struct curl_slist* (*curl_slist_append)(struct curl_slist *, const char *);

然后我动态链接它:

  hLibCurl = dlopen(LIBCURL_PATH_64, RTLD_NOW);
*(void**) (&curl_easy_init) = dlsym(hLibCurl, "curl_easy_init");
*(void**) (&curl_slist_append) = dlsym(hLibCurl, "curl_slist_append");
*(void**) (&curl_easy_setopt) = dlsym(hLibCurl, "curl_easy_setopt");
*(void**) (&curl_easy_strerror) = dlsym(hLibCurl, "curl_easy_strerror");
*(void**) (&curl_easy_perform) = dlsym(hLibCurl, "curl_easy_perform");
if ( (curl = (*curl_easy_init)()) == NULL ){
LogMsg("CurlInit easy_init failed");
return -1;
}

此时它不会退出或失败。
那么这就是节目开始的地方。当像这样设置curlopts时,我没有收到错误:

  if ((*curl_easy_setopt)(curl, CURLOPT_POST, 1) != CURLE_OK) {
LogMsg("curl_easy_setopt(curl, CURLOPT_POST, 1) failed");
return -1;
}
if ((*curl_easy_setopt)(curl, CURLOPT_URL, "https://ws.service.com.br/services-nac/services/SomeService?wsdl") != CURLE_OK) {
LogMsg("curl_easy_setopt(curl, CURLOPT_URL) failed");
return -1;
}
if ((*curl_easy_setopt)(curl, CURLOPT_PORT, 443) != CURLE_OK) {
LogMsg("curl_easy_setopt(curl, CURLOPT_PORT, 443) failed");
return -1;
}

但是,当 easy_performing 时我遇到了段错误:

   if ( (res = (*curl_easy_perform)(curl)) != CURLE_OK ){
return -1;
}

我很确定错误是在 Easy Perform 上发生的,但我决定继续生成一个 core_dump。当我 gdb 这个核心时,我实际上在 easy_init 上遇到了错误:

Program terminated with signal 11, Segmentation fault. #0 0x00007f3d2f9cd3f8 in curl_easy_init () from curlapp

有人知道这里可能出了什么问题吗?

提前致谢!

<小时/>

[编辑]

我已经删除了curl_easy_perform block ,程序运行正常。我不确定它的失败是因为curl_easy_perform() 还是仅仅因为在这个函数中发生了事情。换句话说,这可能意味着“init”和“setopts”仅应用于 easy_perform。 (只是猜测)

[编辑2]

更改了 dlsym block :

  curl_easy_init = 
(CURL* (*)(void))
dlsym(hLibCurl, "curl_easy_init");
curl_slist_append =
(struct curl_slist*(*)(struct curl_slist *, const char *))
dlsym(hLibCurl, "curl_slist_append");
curl_easy_setopt =
(CURLcode (*)(CURL *, CURLoption, ...))
dlsym(hLibCurl, "curl_easy_setopt");
curl_easy_perform =
(CURLcode (*)(CURL *))
dlsym(hLibCurl, "curl_easy_perform");

在函数调用中:

 if ( curl_easy_setopt(curl, CURLOPT_POST, 1) != CURLE_OK) {
if ( DEBUG_DETAILS ) vTrace("curl_easy_setopt(curl, CURLOPT_POST, 1) failed");
return -1;
}

但我仍然在curl_easy_init()处遇到段错误。
有人可以帮助我吗?

最佳答案

首先加载并调用 curl_global_init,如:http://curl.haxx.se/libcurl/c/curl_global_init.html 中所述

关于c - 动态链接 LibCURL 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26918346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com