2016-12-30 128 views
0

我不知道如何將curl包含到我的項目中。我讀過這個Getting LibCurl to work with Visual Studio 2013,但在我的文件夾中curl(從https://curl.haxx.se/download.html#Win64 - Win64 x86_64 7zip)只有libcurl.dll在bin文件夾中。在lib文件夾中,只有libcurl.alibcurldll.a將libcurl包含到Microsoft Visual Studio 2015中

我已經添加了包括路徑VC++目錄 - > 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; 
} 

,但我得到的錯誤是這樣的:

解析的外部符號__imp_curl_easy_strerror在函數中引用handle_url

回答

0

您必須將您的應用程序與libcurl.a(用於靜態鏈接)或libcurldl l.a(用於動態鏈接)。

首先,你應該在指向包含這些.a文件的文件夾的項目設置添加一個額外的庫目錄,之後有兩種選擇:

要添加一個項目設置的依賴...

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

...或使用預處理器(僅此行的代碼添加到源文件):

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

祝你好運!

+0

爲什麼沒有合適的'.lib'文件,如果這是Microsoft和Windows? '.a'文件通常用於Unix/Linux。 –

+0

是的,這個擴展名被gcc/clang/llvm編譯器用作庫的默認值,但擴展名僅僅是文件名的一部分。我沒有機會嘗試將這些文件提供給VS(現在在macOS上),但我認爲可以鏈接到.a文件(假設它們由VS編譯並重命名爲* .a) – dmsovetov

+0

P.S.看起來像.a和.lib文件使用相同的文件格式http://stackoverflow.com/a/2819992/5719384,只是一個編譯對象文件的存檔 – dmsovetov