java libtorrent_[转载]libtorrent安装windows版
自己折腾了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
}
#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才会包含头文件,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替换了一下就用上了,编译没报错也就没发现
有什么不对的,囧死了。
java libtorrent_[转载]libtorrent安装windows版相关推荐
- Xamarin.Forms教程下载安装Windows版的Xamarin开发工具
Xamarin.Forms教程下载安装Windows版的Xamarin开发工具 下载安装Windows版的Xamarin开发工具 本节将讲解如何下载并安装Windows版的Xamarin开发工具. 下 ...
- 安装Windows版C / GCC编译器
The first step in learning any programming language is to have the required software installed in th ...
- Linux安装Windows版的QQ,在Linux下完美运行Windows PC版QQ/TIM教程
转自 http://www.ithome.com/html/win10/307236.htm 感谢IT之家网友 DotNet码农 的投稿 对于很多开发人员来说,Linux可能是他们的主要工作环境,然而 ...
- 3dmax linux版本,[转载]如何安装Linux版FLOW-3D及注意事项
安装linux版的flow3d流程: 1.复制flow3d安装CD盘中unix文件夹到linux系统桌面:(或从CD中直接安装也可以) 2.从terminal进入unix文件夹: 3../instal ...
- onlyoffice文件服务器安装,在本地服务器上安装Windows版ONLYOFFICE Integration Edition
介绍 Integration Edition允许您在本地服务器上安装Document Server,并将在线编辑器与Web应用程序集成. Document Server是一个在线办公套件,包括用于文本 ...
- Java开发环境搭建(windows版、史上最详细版)
转自:https://blog.csdn.net/runing_it_man/article/details/77800639 Java开发环境搭建 在本章节中我们将为大家介绍如何搭建Java开发环境 ...
- mysql5.7.23手动配置安装windows版
1.mysql下载地址 官网:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 官网我下载的是: 百度网盘:链接: https://pa ...
- appium java环境_Appium环境搭建(Windows版)
注:appium安装到C盘,node.js安装到C盘 一.安装node.js 1.到官网下载node.js:https://nodejs.org/en/download/ 2.获取到安装文件后,直接双 ...
- kafka安装(windows版)
一.安装JDK 过程比较简单,就不在详细说明 二.安装zookeeper # 1.下载安装包 https://zookeeper.apache.org/releases.html#download # ...
- Redis 下载与安装(Windows版)(*)
一.下载 1.Github下载地址:https://github.com/MicrosoftArchive/redis/releases 2.百度网盘下载地址:Redis-x64-3.2.100.zi ...
最新文章
- 一台主机装两个mysql数据库_一台主机装两个mysql数据库
- 框架应用 : Spring - 开发详述
- Office 365 Exchange 2016 混合部署前准备
- GitHub 回滚操作
- 深入理解分布式消息队列
- 福昕高级PDF编辑器
- PDFlib使用实例
- 使用Timer的缺陷
- Struts2-Value Stack浅析
- 【Transformer】10个重要问题概览Transformer全部内容
- 面试资料-计算机网络
- vtk相机_VTK相机参数
- 什么叫服务器加密狗信息异常,加密狗不能识别,只是服务器能用,客户端提示到期,是什么原因,已经换了口,也重启过电脑了。...
- 中国十大会计师事务所排名公布!刚刚,中注协正式通知!
- 打卡签到python代码_[python] 初学python,打卡签到
- Spark多版本共存
- 线下销售增长51%,荣耀靠的可不是把体验店装修的像Apple store
- 宾果消消消鸿蒙版,宾果消消消官方版
- 英语论文格式有什么要求?
- java // for // 俄文字母表