2011-10-26 101 views
1

我有我從here複製下面的代碼:捲曲HTTP PUT compliation失敗

/*************************************************************************** 
*         _ _ ____ _ 
* Project      ___| | | | _ \| | 
*       /__| | | | |_) | | 
*       | (__| |_| | _ <| |___ 
*        \___|\___/|_| \_\_____| 
* 
* Copyright (C) 1998 - 2011, Daniel Stenberg, <[email protected]>, et al. 
* 
* This software is licensed as described in the file COPYING, which 
* you should have received as part of this distribution. The terms 
* are also available at http://curl.haxx.se/docs/copyright.html. 
* 
* You may opt to use, copy, modify, merge, publish, distribute and/or sell 
* copies of the Software, and permit persons to whom the Software is 
* furnished to do so, under the terms of the COPYING file. 
* 
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 
* KIND, either express or implied. 
* 
***************************************************************************/ 
#include <stdio.h> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <unistd.h> 

#include <curl/curl.h> 
#include "printf_macro.h" 

/* 
* This example shows a HTTP PUT operation. PUTs a file given as a command 
* line argument to the URL also given on the command line. 
* 
* This example also uses its own read callback. 
* 
* Here's an article on how to setup a PUT handler for Apache: 
* http://www.apacheweek.com/features/put 
*/ 

static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) 
{ 
    size_t retcode; 

    /* in real-world cases, this would probably get this data differently 
    as this fread() stuff is exactly what the library already would do 
    by default internally */ 
    retcode = fread(ptr, size, nmemb, stream); 

    fprintf(stderr, "*** We read %" _FMT_SIZE_T " bytes from file\n", retcode); 

    return retcode; 
} 

int main(int argc, char **argv) 
{ 
    CURL *curl; 
    CURLcode res; 
    FILE * hd_src ; 
    int hd ; 
    struct stat file_info; 

    char *file; 
    char *url; 

    if(argc < 3) 
    return 1; 

    file= argv[1]; 
    url = argv[2]; 

    /* get the file size of the local file */ 
    hd = open(file, O_RDONLY) ; 
    fstat(hd, &file_info); 
    close(hd) ; 

    /* get a FILE * of the same file, could also be made with 
    fdopen() from the previous descriptor, but hey this is just 
    an example! */ 
    hd_src = fopen(file, "rb"); 

    /* In windows, this will init the winsock stuff */ 
    curl_global_init(CURL_GLOBAL_ALL); 

    /* get a curl handle */ 
    curl = curl_easy_init(); 
    if(curl) { 
    /* we want to use our own read function */ 
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); 

    /* enable uploading */ 
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); 

    /* HTTP PUT please */ 
    curl_easy_setopt(curl, CURLOPT_PUT, 1L); 

    /* specify target URL, and note that this URL should include a file 
     name, not only a directory */ 
    curl_easy_setopt(curl, CURLOPT_URL, url); 

    /* now specify which file to upload */ 
    curl_easy_setopt(curl, CURLOPT_READDATA, hd_src); 

    /* provide the size of the upload, we specicially typecast the value 
     to curl_off_t since we must be sure to use the correct data size */ 
    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, 
        (curl_off_t)file_info.st_size); 

    /* Now run off and do what you've been told! */ 
    res = curl_easy_perform(curl); 

    /* always cleanup */ 
    curl_easy_cleanup(curl); 
    } 
    fclose(hd_src); /* close the local file */ 

    curl_global_cleanup(); 
    return 0; 
} 

它要求這個header

當我嘗試編譯put.cpp如下:

g++ put.cpp -lcurl 

我得到以下錯誤:

put.cpp: In function `size_t read_callback(void*, size_t, size_t, void*)': 
put.cpp:47: error: invalid conversion from `void*' to `FILE*' 
put.cpp:47: error: initializing argument 4 of `size_t fread(void*, size_t, size_t, FILE*)' 

我怎樣才能解決這個問題?

回答

2

變化read_callback簽名輸入stream作爲FILE*

+0

static FILE * read_callback(void * ptr,size_t size,size_t nmemb,void * stream)??像那樣? – DarthVader

+1

'static size_t read_callback(void * ptr,size_t size,size_t nmemb,FILE * stream)' – totowtwo

+0

working。謝謝:) – DarthVader

2

這看起來像C代碼,其不作爲C++以及編譯。從void*轉換需要在C++中強制轉換,但隱含在C中。

要麼使用gcc編譯添加所需的強制轉換。

+0

gcc會編譯一個擴展名爲「* .cpp」的文件作爲C++。您需要重新命名擴展名爲「* .c」的文件。請參閱:http://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc/173007#173007 –

+0

其他響應實際上工作。謝謝。 – DarthVader