自己折腾了3、4天都没弄好,今晚在jhl师兄指点下终于搞定。记下来,免得以后又犯错。

1、到http://code.google.com/p/libtorrent/downloads/list下载libtorrent(和Linux下的那个

libtorrent没关系),我的版本是libtorrent-rasterbar-0.15.2,刚刚看到,7小时前作者上传了

最新版libtorrent-rasterbar-0.15.3,解压到E:\libtorrent-rasterbar-0.15.2

2、libtorrent要用到openssl,到http://www.openssl.org/source/openssl-1.0.0-beta3.tar.gz下

载,解压到E:\openssl-1.0.0-beta3

3、编译openssl

1 安装ActivePerl,下载地址

http://downloads.activestate.com/ActivePerl/Windows/5.10/ActivePerl-5.10.0.1005-MSWin32-x8

6-290470.msi

2 运行visual studio2008命令提示符工具,进到openssl的目录下,顺次运行命令

perl configure VC-WIN32

ms\do_ms

nmake -f ms\ntdll.mak (编译静态版本的执行 nmake -f ms\nt.mak )

编译完成后会在 E:\openssl-1.0.0-beta3\out32dll 目录下生成库文件、动态链接库文件、Openssl执行

文件和测试程序。

4、libtorrent还要用到boost,我之前已经有了,所以不用费事。没有的话就自己去下载boost

的源码编译,最好是把动态、静态,debug、release等各种版本全都编译了,免得以后麻烦。

再把boost的头文件和库文件目录加到visual studio的VC++目录里去,以后会经常用到的。

5、新建win32空白项目,把E:\libtorrent-rasterbar-0.15.2\include\libtorrent目录下的头文件

(包括其下的aux_、extensions、kademlia文件夹内的头文件)以及

E:\libtorrent-rasterbar-0.15.2\zlib目录下的头文件包含进来,再将

E:\libtorrent-rasterbar-0.15.2\src(包括其下的kademlia目录内的文件)目录下的源文件添加

到项目中。

6、参照E:\libtorrent-rasterbar-0.15.2\docs\building.html中的building with other build systems

部分进行设置:

将项目属性-》C/C++ -》语言中的 强制for循环范围中的合规性、将wchar_t视为内置类型、

启用运行时类型信息这三项设为 是

再根据需要设置预处理器定义,我的是

WIN32_LEAN_AND_MEAN

_WIN32_WINNT=0x0600

__USE_W32_SOCKETS

_DLL

WIN32

_WIN32

_DEBUG

TORRENT_USE_BOOST_DATE_TIME

TORRENT_USE_OPENSSL

TORRENT_NO_DEPRECATE

_CRT_SECURE_NO_DEPRECATE

_SCL_SECURE_NO_DEPRECATE

_CRT_SECURE_NO_WARNINGS

_SECURE_SCL=0

_HAS_ITERATOR_DEBUGGING=0

TORRENT_BUILDING_SHARED

UNICODE

_UNICODE      (_UNICODE宏用于C运行时头文件,而UNICODE宏则用于Windows头文件)

7、根据自己的需要选择编译libtorrent库的版本,我的配置是:

项目属性-》配置属性-》常规  配置类型:动态库dll  字符集:使用Unicode(其

实预处理器里已经定义了UNICODE)

项目属性-》C/C++-》代码生成 运行库:/MDd

8、项目属性-》C++ -》常规 添加附加包含目录

$(SolutionDir)\include\libtorrent

$(SolutionDir)\include\

E:\openssl-1.0.0-beta3\include

(SolutionDir=E:\libtorrent-rasterbar-0.15.2)

项目属性-》链接器-》常规 添加附加库目录

E:\openssl-1.0.0-beta3\out32dll

9、项目属性-》链接器-》输入-》附加依赖项 里面加上openssl的库

libeay32.lib

ssleay32.lib

10、可以开始编译了。

11、编译自带的例子(E:\libtorrent-rasterbar-0.15.2\examples)时,项目属性一定要和编

译libtorrent的保持一致,比如上面设置了Unicode,那例子也要设Unicode,上面是/MDd,

例子也要是/MDd。

当然还要记得设置附加包含目录,加上libtorrent和openssl的头文件目录

E:\libtorrent-rasterbar-0.15.2\include

E:\openssl-1.0.0-beta3\include

设置链接器的附加库目录,加上libtorrent和openssl的库文件目录

E:\openssl-1.0.0-beta3\out32dll

E:\libtorrent-rasterbar-0.15.2\Debug

加上链接器的附加依赖项

libtorrent.lib

libeay32.lib

ssleay32.lib

编译通过,链接的时候报 无法解析的外部符号SHA1_UPDATE,但是我明明添加了openssl

的附加依赖项进去。用dependency walker(可以查看dll中提供的函数接口列表)查看

libeay32.dll,看到里面确实有SHA1_UPDATE这个函数,奇了怪了。

仔细看错误

make_torrent.obj : error LNK2019: 无法解析的外部符号 "void __cdecl SHA1_Update(struct

SHA_CTX *,unsigned char const *,unsigned long)"

(?SHA1_Update@@YAXPAUSHA_CTX@@PBEK@Z),该符号在函数 "public: __thiscall

libtorrent::hasher::hasher(char const *,int)" (??0hasher@libtorrent@@QAE@PBDH@Z) 中被引

是在libtorrent库里面用到了,具体的说应该是 命名空间libtorrent下的class hasher的hasher

成员函数 用到了SHA1_UPDATE函数,那如果找不到SHA1_UPDATE的话,libtorrent也应该

报lnk2019的啊。为什么libtorrent可以,例子却不可以呢。

打开libtorrent\hasher.hpp,开头有这么一段代码

#ifdef TORRENT_USE_OPENSSL

extern "C"

{

#include <openssl/sha.h>

}

#else

// from sha1.cpp

struct TORRENT_EXPORT SHA_CTX

{

boost::uint32_t state[5];

boost::uint32_t count[2];

boost::uint8_t buffer[64];

};

TORRENT_EXPORT void SHA1_Init(SHA_CTX* context);

TORRENT_EXPORT void SHA1_Update(SHA_CTX* context, boost::uint8_t const* data,

boost::uint32_t len);

TORRENT_EXPORT void SHA1_Final(boost::uint8_t* digest, SHA_CTX* context);

#endif

要定义了TORRENT_USE_OPENSSL才会包含头文件<openssl/sha.h>,SHA1_UPDATE就是在这

个头文件中声明的。后面的else部分就是不使用openssl时的做法了,暂时没看懂。

make_torrent这个例子里调用了hasher这个函数,因为包含了"libtorrent/hasher.hpp",并导

入了libtorrent.lib,所以编译是不会报错的,但链接的时候libtorrent.lib里的hasher要链接

libeay32.lib中的SHA1_UPDATE,如果没有包含sha.h,那libtorrent.lib当然找不到

SHA1_UPDATE了。

最新补充:知道else部分的作用了,原来libtorrent本身有提供sha1的实现(src\sha1.cpp),我再一次遗漏了一个源码文件,悲剧。如果不定义TORRENT_USE_OPENSSL,则libtorrent库导出的是自己实现的SHA1函数,定义了TORRENT_USE_OPENSSL,则使用openssl提供的。现在把sha1.cpp也包含到libtorrent里去,生成完整的libtorrent库,现在再编译make_torrent就不必添加预处理器定义TORRENT_USE_OPENSSL了。

预处理器定义了加上TORRENT_USE_OPENSSL,编译链接成功。再把libtorrent.dll、libeay32.dll、

ssleay32.dll拷贝到make_torrent.exe同一文件夹下,可以运行了。

=========================================================================================

附注一:如果使用的是boost_1_39_0(可能还有别的版本也有这个问题)的话,

会有SSL_METHOD(还是SSL_CTX?不记得了)的const指针转非const的错误。 需

要修改boost_1_39_0\boost\asio\ssl\detail\openssl_context_service.hpp文件,

找到函数void create(impl_type& impl, context_base::method m) ,替换为

// Create a new context implementation.

void create(impl_type& impl, context_base::method m)

{

switch (m)

{

case context_base::sslv2:

impl = ::SSL_CTX_new(::SSLv2_method());

break;

case context_base::sslv2_client:

impl = ::SSL_CTX_new(::SSLv2_client_method());

break;

case context_base::sslv2_server:

impl = ::SSL_CTX_new(::SSLv2_server_method());

break;

case context_base::sslv3:

impl = ::SSL_CTX_new(::SSLv3_method());

break;

case context_base::sslv3_client:

impl = ::SSL_CTX_new(::SSLv3_client_method());

break;

case context_base::sslv3_server:

impl = ::SSL_CTX_new(::SSLv3_server_method());

break;

case context_base::tlsv1:

impl = ::SSL_CTX_new(::TLSv1_method());

break;

case context_base::tlsv1_client:

impl = ::SSL_CTX_new(::TLSv1_client_method());

break;

case context_base::tlsv1_server:

impl = ::SSL_CTX_new(::TLSv1_server_method());

break;

case context_base::sslv23:

impl = ::SSL_CTX_new(::SSLv23_method());

break;

case context_base::sslv23_client:

impl = ::SSL_CTX_new(::SSLv23_client_method());

break;

case context_base::sslv23_server:

impl = ::SSL_CTX_new(::SSLv23_server_method());

break;

default:

impl = ::SSL_CTX_new(0);

break;

}

}

这是boost官方提供的修改方案,参见http://lists.boost.org/boost-commit/2009/07/17636.PHP

如果是boost_1_44_0的话,则不需要修改。

附注二:我有大部分时间浪费在一大堆的lnk2001和lnk2019错误上。按道理这都应该是附

加依赖库里面没有提供代码中调用的一些函数所致,但是报错的无法解析的外部符号都是

libtorrent自己的函数,让我很纠结。最后发现这些外部符号指的函数有声明,却没有定义,

囧!。我居然漏掉了3个cpp文件没有包含进去,有函数声明了但没有定义,编译却没有报

错,应该和这是一个dll项目有关,如果是exe的话编译就报错了,我也不会浪费这么多时

间在这么低级的问题上了。

附注三:之所以会漏掉这么多源码文件没包含,是因为我偷懒了,使用了halite里面自带的

libtorrent.vcproj,把里面的文件目录ctrl+r替换了一下就用上了,编译没报错也就没发现

有什么不对的,囧死了。

http://www.cppblog.com/hblhs/archive/2010/03/03/108769.html

上一篇关于libtorrent的随笔是有错误的,我的项目里中文路径的问题主要是多字节编码和宽字节编码混合,这样在libtorrent里面面转换的时候怎么转都会有乱码,解决的办法是在传入路径的时候保证编码一致,基本上就没什么问题的。对于我的随笔给大家引起的不便深表歉意。

有很多朋友给我发邮件想要一份可以在windows编译的libtorrent,其实这个有一个很快捷的方法去得到一个可以用VC编译的libtorrent版本,在sf(sourceforge.net)上面搜索fdm,第一个就是,从SVN下载这个项目的源码,里面的bittorrent部分就是libtorrent了,而且还有一个封装libtorrent的dll项目,拿来用吧。不过我今天写的不是这种方式的获得。主要原因是这个项目所用的libtorrent不保证是最新版的,因为要在VC里面编译,所以会改很多东西,很可能已经失去了跨平台这个特性,这是我猜的,没去实践。
基于上面的原因,还是决定下载它的源码自己编译。在windows上编译linux下的源码主要是用mingw,所以首先要下载mingw,想了解这个东西的功能在网上找找资料吧。同上,在SF搜索MINGW,点第一个项目(

MinGW - Minimalist GNU for Windows

),下载MinGW-5.1.6.exe(以后这个名字肯定会变,版本更新).把它放到你要放置MINGW的地方,运行,这是个在线安装工具,一路下一步,到select components to install的时候可以不选择java,ada,g77,objective的编译器,下一步到完成。接下来还要安装一个msys,这个就是在windows模拟一个linux的环境,用来调用mingw的东西(个人理解)。下载地址:http://mingw.org/wiki/MSYS 这里有下载的连接,因为在SF上版本更新之后下载地址可能会有变动,所以最好在这里来点它提供的地址的下载。Install MSYS 1.0.11(点前面的连接下载,版本更新之后名字可能会变). I usually install it in C:/msys/1.0, but you can use any directory that you prefer.  它这它里说可以用任何你喜欢的目录安装,但是根据我的实践,你最好还是按照我说的去安装,要不然编译不能通过不要怪我。下载完成之后运行,重要的是选择安装目录,假定你的MINGW安装目录为d:/librarys/MinGW,那你也要把MSYS安装到这个目录,注意,如果你是用鼠标选择到这个目录的它会自己在这个目录后面加上1.0,把这个1.0去掉,保证和MinGW的安装目录一致。安装完成的时候会弹出个命令窗口,按两次Y,回车之后会让你提供MinGW的安装目录,例如上面的路径,你需要输入d:/librarys/MinGW,这里的斜杠和windows下的相反。回车之后安装完成。

上边说的是在windows编译libtorrent需要的环境,环境准备好了还不能编译,还需要装备一些必要的库和工具。
1、make.exe,这个是可能会需要的,说它可能是因为在我多次安装编译环境的过程中只有一次提示没有这个命令,不知道哪的问题,不过也不用深究,提示没有下载一个就是了。
2、boost,这个库是必要的,而且安装需要费一些精力。如果你有现成的最好,没有的话有两种方法,a)、http://www.boostpro.com/download到这来下载个boost的下载工具,用它下载下来的boost是已经编译好的。b)、下载boost源码,在网上找一下boost的编译教程,自己编译。第二种方法稍有些麻烦,第一种方法最简单。在获得boost之后还有一步需要做,需要把boost安装目录下的boost目录移动到include/boost_1_39/目录下面,可能是因为新版的结构和老版的不一样。
3、ssl,安全套接层(Secure Sockets Layer,SSL)及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。上面的解释是从网上复制的,我也不十分了解,反正这个是要用到的。
上面提到的库和工具都可以在SF下载得到,1和3可以在一个叫MinGW-install的项目里下载到,解压后直接复制到MinGW的安装目录即可。
经过上面的准备就可以开始编译libtorrent了,又想起一点,下载libtorrent的时候要注意,一定要在它的官方地址下载,在SF上下载的我没有编译通过。下面是它的官方地址http://www.rasterbar.com/products/libtorrent/,他好像更新到google上面了。我下载的是 libtorrent-rasterbar-0.14.9.tar.gz 。解压,打开MSYS窗口,转到libtorrent解压之后的目录,输入命令,./configure --with-boost='/d/librarys/boost_1_39/' --with-boost-thread=boost_thread-vc80-mt-1_39  。这个命令可能跟你需要执行的不一样,根据你的boost版本的安装路径去改变。
如果没有提示错误,正常完成的话可以继续执行make进行编译,编译需要一些时间。如果没有错误会在libtorrent的子目录src/.libs下面发现libtorrent-rasterbar.a,近三百兆的一个库。
至此libtorrent编译完成

windows安装配置libtorrent相关推荐

  1. Meld Diff for windows 安装配置

    Meld Diff for windows 安装配置 如果你是在ubuntu 下开发, meld diff 这个工具你肯定不会陌生, 而且很好用. 之前在网上看到 meld for Windows 的 ...

  2. windows 安装配置 pycharm 创建项目并运行代码

    windows 安装配置 pycharm 创建项目并运行代码 PyCharm 是由 JetBrains 打造的一款 Python IDE,支持 macOS. Windows. Linux 系统. Py ...

  3. Windows安装配置tidevice

    一直以来,iOS自动化的实现和执行都依赖Mac系统,其主要原因是因为需要通过Xcodebuild编译安装WDA (WebDriverAgent)到iOS设备中,通过WDA实现对被测应用进行操作.而Wi ...

  4. windows 安装 php memcached,Windows安装配置php+memcached的方法

    Windows下Memcached的安装配置方法 1.将第一个包解压放某个盘下面,比如在c:\memcached. 2.在终端(也即cmd命令界面)下输入 'c:\memcached\memcache ...

  5. 在windows安装配置Git开发环境

    转至:http://www.xbc.me/install-git-on-windows/ 上一篇文章在Ubuntu上配置Git Server后就要本地安装客户端,开始配置Git的开发环境.首先从goo ...

  6. RocketMQ在windows安装配置及使用

    最近接手了一个微服务项目,这个项目中用到了RocketMQ消息中间件.于是自己在本地测试时,需要在windows上安装RocketMQ. 一.安装windows版本RocketMQ 1.1 首先去官网 ...

  7. Windows安装配置Oracle

    1.Oracle下载 Oracle官网地址:https://www.oracle.com/database/technologies/oracle-database-software-download ...

  8. windows安装配置opencv opencv_contrib

    目录 前言 python用户 c++用户 一,下载cmake,opencv,opencv_contrib,Visual Studio 1,下载安装cmake 2,下载opencv,opencv_con ...

  9. Windows安装配置Apache简易服务器-----(详细,成功率极高)

    最近在学安卓的Xml,Json的数据解析,发现不知道在哪里找xml,json练手,索性自己搭个简易的服务器随意写点xml,json数据练练手 本文章将分为2部分 第一部分:安装Apache,并写好,x ...

  10. Windows安装配置Git教程(2022.11.18 Git2.38.1)

    (1)首先前往Git官网,下载安装文件: (2)打开安装程序,把 Only show new options 的勾去掉,点击 Next: (3)此处可以选用默认设置,也可以勾上 Add a Git B ...

最新文章

  1. [School Life - Study] 有哪些每天坚持效果显著的高中学习习惯?
  2. 使界面里的组件更圆滑
  3. [zjoi2015]幻想乡战略游戏
  4. WebApiClient的JsonPatch局部更新
  5. 无法启动mysqll1006_CentOS7下MySQL服务启动失败原因及解决方法
  6. c语言%3c与 的优先级,C语言程序设计第3章顺序程序设计.ppt
  7. 随想录(被高估的busybox)
  8. java最小子串覆盖_LeetCode 76. 最小覆盖子串
  9. node sqlite 插入数据_Python基础系列讲解——如何使用自带的SQLite数据库
  10. 《编程之道》(转载) 全文
  11. Chrome导出扩展程序
  12. Python2020期末考试试题及答案
  13. php数据传输神器,「curl」PHP中的传输神器
  14. linux----创建主分区、扩展分区、在扩展分区上建立逻辑分区。
  15. JAVA计算机毕业设计阿尔兹海默病Mybatis+系统+数据库+调试部署
  16. 六面阿里天猫,已拿offer,我的面经复盘总结,原来进大厂没那么难了
  17. 新茶饮式资本扩张,该停脚歇歇了
  18. ctf misc 学习总结大合集
  19. Google Maps Download Tool 谷歌地图下载工具
  20. java 如何给游戏加音效,修改添加游戏中各种音效的步骤

热门文章

  1. 为什么要使用线阵相机?
  2. ZEMAX | 如何使用极探测器和 IESNA / EULUMDAT 光源数据
  3. 交通信息工程 实验三:交通信号机仿真实验
  4. matlab hspice联合仿真,matlab hspice
  5. MAC 配置svn比较工具diffmerge
  6. (1.6w字)浏览器灵魂之问,请问你能接得住几个?
  7. NPDP 产品经理国际资格认证
  8. oracle库怎么样查询gp数据库,GP数据库分布键查询
  9. 支付中心设计与方案,收藏了
  10. 实现在线预览office文档(word,excel,ppt)的几种方法