http://curl.haxx.se/下载的win32版本的curl都不能使,#include <curl.h>后总是报错:external symbol ,意思就是没有链接到curl的各种library,最后尝试了n多次终于成功了,希望大家以后少走弯路!

以Windows 8 64bit,Visual Studio 2012 为例:

1、获取curl:

这里可以获得所有版本的curl,我下载的是Win32
- MSVC
版本的curl,我下载的是MSVC 7.19.3 devl SSL 版本,可以从这里下载。

2、解压后得到一个文件夹“libcurl-7.19.3-win32-ssl-msvc”,可以看到里面有include文件夹和lib文件夹

3、添加引用:用Visual Studio打开你的C++工程,选择Project ->project name Properties -> Configuration
Properties -> VC++ Dicrectories 在右侧的Include Directories添加“libcurl-7.19.3-win32-ssl-msvc\include”的绝对路径,如:“X:\a\b\c\libcurl-7.19.3-win32-ssl-msvc\include”,其中“X:\a\b\c\”根据你curl解压到的地方不同,要有所变动。

同理,将“libcurl-7.19.3-win32-ssl-msvc\lib\debug”的绝对路径添加到Libraries Directories中,注意libcurl-7.19.3-win32-ssl-msvc\lib文件夹中包含debug和release两个文件夹,这里之所以添加debug文件夹是因为笔者当前vs的编译模式是debug的,如果你当前的编译模式是release的,那么请将libcurl-7.19.3-win32-ssl-msvc\lib\release文件夹添加到这里,而不要添加debug。

注:在哪种编译模式下就添加哪个文件夹!要把绝对路径写上,而不是相对路径!如果你不知道什么是绝对路径,请看这里

4、添加lib:选择左侧的Configuration Properties -> Linker -> Input 将Additional Dependencies中加入:

curllib.lib和curllib_static.lib这两个,然后保存

5、拷贝dll:将libcurl-7.19.3-win32-ssl-msvc文件夹下所有的.dll文件拷到VS工程目录下的Debug文件夹中。注意,这里之所以拷到VS工程Debug文件夹中,是因为VS编译后的.exe运行时侯会寻找.dll,如果不放过来就该提示有错误了。另外,VS
2012 编译后可能会生成2个或2个以上的Debug文件夹,但只有一个Debug里有编译后生成的.exe文件,要放到这个Debug里,不要放错。PS,据说将.dll放到C盘System32文件夹里可以一劳永逸,不用每次新建工程都要拷贝.dll到Debug下,不过有待考证,我没试过。

6、关于libsasl.dll:此时运行可能会提示你缺少libsasl.dll,这个dll下载的curl里是没有的,可以从网上下一个,然后和其他的.dll一样放到Debug目录下,最后编译就可以运行了

7、获取ftp文件的示例:这里是一份获取FTP服务器文件的示例代码,可以测试curl是否配置成功(前提是你要有个FTP服务器,如果你没有,但是想搭建一个简单的FTP服务器,请看这里

要修改"ftp://192.168.1.101/sc.jpg"和"username:userpassword"两个参数,这分别对应着FTP服务器上文件的地址,和FTP服务器的用户名和密码,注意用户名和密码中间有个冒号分隔。

8、Good luck!

#include <string>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <curl\curl.h>
#include <stdio.h>
using namespace std; struct FtpFile
{
const char *filename;
FILE *stream;
}; static size_t FetchFiles(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct FtpFile *out = (struct FtpFile *)stream;
if (out && !out->stream)
{
// open file for writing
out->stream = fopen(out->filename, "wb");
if (!out->stream)
return -1; // failure, can't open file to write
}
return fwrite(buffer, size, nmemb, out->stream);
} int DownloadFtpFile()
{
CURL *curl;
CURLcode res;
struct FtpFile ftpfile = {
"a.jpg", // name to store the file as if succesful//
NULL
}; curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init(); if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL,"ftp://192.168.1.101/sc.jpg");
curl_easy_setopt(curl, CURLOPT_USERPWD, "username:userpassword");
// Define our callback to get called when there's data to be written //
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, FetchFiles);
// Set a pointer to our struct to pass to the callback //
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile); // Switch on full protocol/debug output //
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); res = curl_easy_perform(curl); // always cleanup
curl_easy_cleanup(curl); if (CURLE_OK != res)
{
//we failed
fprintf(stderr, "curl told us %d\n", res);
}
} if (ftpfile.stream)
fclose(ftpfile.stream); // close the local file curl_global_cleanup(); getchar(); return 0;
} int main(void)
{
DownloadFtpFile();
return 0;
}

C++ 下使用curl 获取ftp文件的更多相关文章

  1. c#FTP操作类,包含上传,下载,删除,获取FTP文件列表文件夹等Hhelp类

    有些时间没发表文章了,之前用到过,这是我总结出来关于ftp相关操作一些方法,网上也有很多,但是没有那么全面,我的这些仅供参考和借鉴,希望能够帮助到大家,代码和相关引用我都复制粘贴出来了,希望大家喜欢 ...

  2. IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案

    上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...

  3. curl获取远程文件内容

    curl获取远程文件内容 ** 获取远程文件内容 @param $url 文件http地址 * function fopen_url($url) { if (function_exists(& ...

  4. Mac OS 终端下使用 Curl 命令下载文件

    在 mac os下,如何通过命令行来下载网络文件?如果你没有安装或 wget 命令,那么可以使用 curl 工具来达到我们的目的. curl命令参数: curl 'url地址' curl [选项] ' ...

  5. FtpHelper类匿名获取FTP文件

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  6. Linux基础命令---get获取ftp文件

    get 使用lftp登录ftp服务器之后,可以使用get指令从服务器获取文件.   1.语法       get [-E]  [-a]  [-c] [-O base]  rfile  [-o lfil ...

  7. Linux基础命令---mget获取ftp文件

    mget 使用lftp登录mftp服务器之后,可以使用mget指令从服务器获取文件.mget指令可以使用通配符,而get指令则不可以.   1.语法       mget [-E]  [-a]  [- ...

  8. C#获取FTP文件详细备注信息

    private void button1_Click(object sender, RoutedEventArgs e) { Uri uri = new Uri("ftp://192.168 ...

  9. 解决在Ubuntu终端下使用cURL获取GBK格式的页面出现乱码问题

    问题描述 在Ubuntu下使用终端使用cURL去拿一个GBK的页面,发现返回来的内容里面中文都是乱码 解决方法 通过iconv来处理乱码拿到的内容,进行转码,示例如下: $curl http://ww ...

随机推荐

  1. [转] Spring Boot特性

    [From] http://blog.javachen.com/2015/03/13/some-spring-boot-features.html 1. SpringApplication Sprin ...

  2. scraoy之日志等级处理

    一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志信息的种类: ERROR : 一般错误 ...

  3. 使用kafka bin目录中的zookeeper-shell.sh来查看kafka在zookeeper中的配置

    cd kafka_2.11-0.10.2.1\bin\windowsecho ls /brokers/ids |  zookeeper-shell.bat localhost:2181 使用kafka ...

  4. Linux快捷指令

    Linux创建一个快捷指令,直接跳转到某个目录中的某个文件 创建快捷指令命令: $ ln -s 源目录 目标快捷方式 删除快捷指令命令: $ unlink 快捷方式名 eg:比如我想在 /usr 目录 ...

  5. Oracle 基础系列之1.1 oracle的安装

    一. 1.以下是安装Oracle的一些硬件上的条件: (1).操作系统最后是windows2000(也就是服务器版的操作系统) (2).内存最好在1G以上,当然越大越好(因为Oracle服务启动就要消 ...

  6. 【CAD】自定义实体的步骤(转)

    本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h"," ...

  7. 案例48-crm练习利用spring管理service和dao层的对象

    1 导包 2 将 Service 对象以及 Dao 对象配置到 spring 容器 <?xml version="1.0" encoding="UTF-8" ...

  8. 关于jqgrid的一些使用

    1.jqgrid如何切换中英文 在做电力监控系统的时候,根据项目的需要涉及到中英文的切换,一直纠结了好久没有好的办法,虽然我知道可以手动更改引入的js文件就可以更改中英文,但是动态的一直没有办法更改, ...

  9. 游戏AI的生命力源自哪里?为你揭开MOBA AI的秘密!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由wataloo发表在专栏wataloo的试验田 1 设计概要 1.1 设计原则和目的 英雄AI的目的主要有: 1.新手过渡局,让玩家刚 ...

  10. 【一】JMeter的介绍安装和使用

    利用JMeter进行性能测试 一.JMeter介绍二.Jmeter安装三.工作原理四.脚本录制五.运行JMeter进行测试六.JMeter主要组件介绍七.参数化设置八.动态数据关联九.使用插件进行服务 ...