【问题标题】:Include libcurl to Microsoft Visual Studio 2015将 libcurl 包含到 Microsoft Visual Studio 2015
【发布时间】:2017-05-14 20:54:34
【问题描述】:

我不知道如何将 curl 包含到我的项目中。我读过这个Getting LibCurl to work with Visual Studio 2013,但是在我的带有 curl 的文件夹中(来自https://curl.haxx.se/download.html#Win64 - Win64 x86_64 7zip)只有 bin 文件夹中的 libcurl.dll。在 lib 文件夹中只有 libcurl.alibcurldll.a

我添加了 VC++ 目录 -> 包含目录的包含路径,并尝试编译此代码:

#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>

struct url_data {
    size_t size;
    char* data;
};

size_t write_data(void *ptr, size_t size, size_t nmemb, struct url_data *data) {
    size_t index = data->size;
    size_t n = (size * nmemb);
    char* tmp;

    data->size += (size * nmemb);

#ifdef DEBUG
    fprintf(stderr, "data at %p size=%ld nmemb=%ld\n", ptr, size, nmemb);
#endif
    tmp = realloc(data->data, data->size + 1); /* +1 for '\0' */

    if(tmp) {
        data->data = tmp;
    } else {
        if(data->data) {
            free(data->data);
        }
        fprintf(stderr, "Failed to allocate memory.\n");
        return 0;
    }

    memcpy((data->data + index), ptr, n);
    data->data[data->size] = '\0';

    return size * nmemb;
}

char *handle_url(char* url) {
    CURL *curl;

    struct url_data data;
    data.size = 0;
    data.data = malloc(4096); /* reasonable size initial buffer */
    if(NULL == data.data) {
        fprintf(stderr, "Failed to allocate memory.\n");
        return NULL;
    }

    data.data[0] = '\0';

    CURLcode res;

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
                fprintf(stderr, "curl_easy_perform() failed: %s\n",  
                        curl_easy_strerror(res));
        }

        curl_easy_cleanup(curl);

    }
    return data.data;
}

int main(int argc, char* argv[]) {
    char* data;

    if(argc < 2) {
        fprintf(stderr, "Must provide URL to fetch.\n");
        return 1;
    }
    data = handle_url(argv[1]);

    if(data) {
        printf("%s\n", data);
        free(data);
    }

    return 0;
}

但我得到这样的错误:

函数handle_url中引用的未解析的外部符号__imp_curl_easy_strerror

【问题讨论】:

    标签: c visual-studio curl


    【解决方案1】:

    您必须将您的应用程序链接到 libcurl.a(用于静态链接)或 libcurldll.a(用于动态链接)。

    首先,您应该在项目设置中添加一个额外的库目录,该目录指向包含这些 .a 文件的文件夹,之后有两个选项:

    在项目设置中添加依赖项...

    Project Properties -> Linker -> Input -> Additional Dependencies.
    

    ...或者使用预处理器(只需将这行代码添加到源文件中):

    #pragma comment(lib, "libcurl.a")
    

    祝你好运!

    【讨论】:

    • 如果适用于 Microsoft 和 Windows,为什么没有合适的 .lib 文件? .a 文件通常用于 Unix/Linux。
    • 是的,这个扩展被 gcc/clang/llvm 编译器用作库的默认值,但扩展只是文件名的一部分。我没有机会尝试将这些文件提供给 VS(现在在 macOS 上),但我认为可以链接到 .a 文件(因为它们是由 VS 编译并重命名为 *.a)
    • P.S.看起来 .a 和 .lib 文件使用相同的文件格式stackoverflow.com/a/2819992/5719384,并且只是已编译目标文件的存档
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多