isinstance 2016-06-20 13:11 采纳率: 0%
浏览 2922
已采纳

C语言写python扩展的时候,undefined symbol: curl_easy_perform

今天又写来一个扩展
然后是一个使用来libcurl包的C模块,想用这个模块替代不稳定的python httplib,然后编译啥的也没有问题,可是最后import进去的时候
报错了
undefined symbol: curl_easy_perform
这是C的源代码

#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>
#include <python2.7/Python.h>

size_t memory_callback(void *data, size_t size, size_t nmemb, void *content)
{
    size_t realsize = size *nmemb;
    char *p = *(char **)content;
    size_t len = p ? strlen(p) : 0;
    *(char **)content = realloc(p, len + realsize + 1);
    p = *(char **)content;
    memcpy(p + len, data, realsize);
    p[len + realsize] = '\0';

    return realsize;
}

size_t get_content(char *appid, char *secret_key, char *q, char *from ,char *to, char **content)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl)
  {
    char myurl[1000] = "http://api.fanyi.baidu.com/api/trans/vip/translate?";
    char salt[60];
    int a = rand();
    sprintf(salt,"%d",a);
    char sign[120] = "";
    strcat(sign,appid);
    strcat(sign,q);
    strcat(sign,salt);
    strcat(sign,secret_key);
    printf("%s\n",sign);
    unsigned char md[16];
    int i;
    char tmp[3]={'\0'},buf[33]={'\0'};

    MD5((const unsigned char *)sign, strlen((const char *)sign), md);

    for (i = 0; i < 16; i++)
    {
        sprintf(tmp,"%2.2x",md[i]);
        strcat(buf,tmp);
    }
    printf("%s\n",buf);
    strcat(myurl,"appid=");
    strcat(myurl,appid);
    strcat(myurl,"&q=");
    strcat(myurl,q);
    strcat(myurl,"&from=");
    strcat(myurl,from);
    strcat(myurl,"&to=");
    strcat(myurl,to);
    strcat(myurl,"&salt=");
    strcat(myurl,salt);
    strcat(myurl,"&sign=");
    strcat(myurl,buf);
    printf("%s\n",myurl);

    /* always cleanup */
    curl_easy_setopt(curl, CURLOPT_URL, myurl);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, memory_callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)content);

    res = curl_easy_perform(curl);
    /* Check for errors */ 
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));
    curl_easy_cleanup(curl);
    }
    return 0;
}

static PyObject *xhttp(PyObject *self, PyObject *args)
{
    char *content = NULL;
    char *appid;
    char * secret_key;
    char *q;
    char *from;
    char *to;
    if(!PyArg_ParseTuple(args, "s|ssss", &appid, &secret_key, &q, &from, &to))
    {
        return NULL;
    }
    get_content(appid, secret_key, q, from, to, &content);

    return Py_BuildValue("s", content);
    if(content) free(content);
}

static PyMethodDef httpMethods[] =
{
    {"xhttp", (PyCFunction)xhttp, METH_VARARGS},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initxhttp(void)
{
    Py_InitModule("xhttp", httpMethods);
}

然后用来

python ./setup.py build

不行

gcc -fpic -lcurl -lssl -c -l /usr/include/python2.7 -l /usr/lib/python2.7/config xhttp.c 
gcc -share -o xhttp.so xhttp.o

最后是可以生成build目录和.o .so文件,但是就是从python shell 中import 进去的时候,会报错

大神下班顺便回答个问题呗~~~

  • 写回答

2条回答 默认 最新

  • isinstance 2016-06-21 02:56
    关注

    好吧,我自己回答自己,是这样的
    指定没有对库文件
    正确的应该所这样

    gcc -shared -I/usr/include/python2.7 -fPIC xhttp.c -lcurl -lssl -pthread -o xhttp.so
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况