VS2008下LibTorrent编译

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

2libtorrent要用到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执行

文件和测试程序。

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

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

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

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

(包括其下的aux_extensionskademlia文件夹内的头文件)以及

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

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

E:\libtorrent-rasterbar-0.15.2\include

E:\openssl-1.0.0-beta3\include

设置链接器的附加库目录,加上libtorrentopenssl的库文件目录

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 hasherhasher

成员函数 用到了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.dlllibeay32.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的话,则不需要修改。

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

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

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

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

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

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

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

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

有什么不对的,囧死了。


其它:::
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

源文件准备

1、从http://sourceforge.net/projects/libtorrent/ 或者 http://code.google.com/p/libtorrent/downloads/list 下载libtorrent-rasterbar-0.14.4.tar.gz,解压到F:\libtorrent

2、下载openssl-1.0.0-beta3解压到F:\libtorrent\openssl-1.0.0-beta3

3、下载boost_1_39_0.tar.bz2解压到F:\boost_1_39_0

编译

3、按照我“使用Visual Studio 2008编译openssl”的文章编译opensll

4、按照我“使用Visual Studio 2008编译boost”的文章编译boost

5、新建win32 lib项目工程libtorrent

     添加F:\libtorrent\src、F:\libtorrent\zlib和F:\libtorrent\src\kademlia下的所有源文件到工程

     在C/C++ -> 预处理器 -> 预处理器定义 中添加下面内容

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头文件)


然后在C/C++ -> 常规 -> 附加包含目录中添加下面内容

     f:\boost_1_39_0;F:\libtorrent\include;F:\libtorrent\zlib;"F:\libtorrent\openssl-1.0.0-beta3\include"

说明:具体路径根据自己的安装或者解压路径而定


6、build即可

说明:如果要编译dll项目,除了添加如上预编译宏外,还要添加TORRENT_BUILDING_SHARED宏,然后添加引用的lib:

libeay32.lib
ssleay32.lib
libboost_date_time-vc90-mt.lib
libboost_filesystem-vc90-mt.lib
libboost_system-vc90-mt.lib
libboost_thread-vc90-mt.lib
在C/C++ -> 常规 -> 解析#using引用 中添加lib的引用路径:

F:\boost_1_39_0\stage\lib;F:\libtorrent\openssl-1.0.0-beta3\out32dll

具体路径根据自己安装或者解压路径而定


完毕---本介绍是一次编译完libtorrent(包含zlib),没有独立编译zlib

下面是两个使用libtorrent的开源项目例子:

Linux:ctorrent

windows:halite

另外附上LibTorrent源代码分析的官网地址:http://www.rasterbar.com/products/libtorrent/manual.html#overview


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值