将libcurl包括到Microsoft Visual Studio 2015中

将libcurl包括到Microsoft Visual Studio 2015中,c,visual-studio,curl,C,Visual Studio,Curl,我不知道如何将curl包含到我的项目中。我读过这篇文章,但在我的curl文件夹(来自-Win64 x86_64 7zip)中,bin文件夹中只有libcurl.dll。在lib文件夹中只有libcurl.a和libcurldll.a 我添加了VC++目录的include path->Inlcude目录,并尝试编译以下代码: #include <stdio.h> #include <curl/curl.h> #include <string.h> #includ

我不知道如何将curl包含到我的项目中。我读过这篇文章,但在我的curl文件夹(来自-Win64 x86_64 7zip)中,bin文件夹中只有libcurl.dll。在lib文件夹中只有libcurl.alibcurldll.a

我添加了VC++目录的include path->Inlcude目录,并尝试编译以下代码:

#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;
}
#包括
#包括
#包括
#包括
结构url\u数据{
大小;
字符*数据;
};
大小写入数据(void*ptr、大小、大小nmemb、结构url\u数据*data){
大小\u t索引=数据->大小;
大小n=(大小*nmemb);
char*tmp;
数据->大小+=(大小*nmemb);
#ifdef调试
fprintf(stderr,“数据在%p大小=%ld nmemb=%ld\n”,ptr,大小,nmemb);
#恩迪夫
tmp=realloc(数据->数据,数据->大小+1);/*+1表示“\0”*/
如果(tmp){
数据->数据=tmp;
}否则{
如果(数据->数据){
免费(数据->数据);
}
fprintf(stderr,“分配内存失败。\n”);
返回0;
}
memcpy((数据->数据+索引),ptr,n);
数据->数据[数据->大小]='\0';
返回大小*nmemb;
}
char*handle\u url(char*url){
卷曲*卷曲;
结构url_数据;
data.size=0;
data.data=malloc(4096);/*合理大小的初始缓冲区*/
if(NULL==data.data){
fprintf(stderr,“分配内存失败。\n”);
返回NULL;
}
data.data[0]='\0';
卷曲编码;
curl=curl_easy_init();
if(curl){
curl_easy_setopt(curl,CURLOPT_URL,URL);
curl\u easy\u setopt(curl,CURLOPT\u WRITEFUNCTION,write\u data);
curl_easy_setopt(curl、CURLOPT_WRITEDATA和data);
res=旋度(curl)\u容易执行(curl);
如果(res!=卷曲(OK){
fprintf(stderr,“curl\u easy\u perform()失败:%s\n”,
卷曲(容易的);
}
旋度\轻松\清洁(旋度);
}
返回数据.data;
}
int main(int argc,char*argv[]){
字符*数据;
如果(argc<2){
fprintf(stderr,“必须提供获取的URL。\n”);
返回1;
}
data=handle_url(argv[1]);
如果(数据){
printf(“%s\n”,数据);
免费(数据);
}
返回0;
}
但我会遇到这样的错误:


未解析的外部符号\uuu imp\u curl\u easy\u strerror在函数handle\u url中引用。您必须根据libcurl.a(用于静态链接)或libcurldll.a(用于动态链接)链接应用程序

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

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

Project Properties -> Linker -> Input -> Additional Dependencies.
…或使用预处理器(只需将这行代码添加到源文件):


祝你好运

如果这是针对Microsoft和Windows的,为什么没有合适的
.lib
文件
.a
文件通常用于Unix/Linux.Yep,gcc/clang/llvm编译器将此扩展名用作库的默认扩展名,但扩展名只是文件名的一部分。我没有机会尝试将这些文件提供给VS(现在在macOS上),但我认为可以链接到.a文件(假设它们由VS编译并重命名为*.a)P.s.看起来像.a和.lib文件使用相同的文件格式,并且只是已编译对象文件的存档
#pragma comment(lib, "libcurl.a")