关于 qBittorrent 编译的一些问题

您可能是开源软件的受害者!

您可能是开源软件的受害者!

您可能是开源软件的受害者!

重要的事情说三遍。

实际上这次也没做什么理论上很麻烦的事情,就是 clone 一个 qBittorrent 4.0.4.3 的源码,配合 libtorrent 1.0.11 编译一下,理论上不应该有什么问题的对吧。然而就是出问题了……

编译的过程很顺利,安装 Deluge PPA 的 libtorrent-rasterbar-dev 和一些 boost 库之后开始编译,然后到了 linking 的过程就报错了:src/base/bittorrent/private/filterparserthread.cpp:99: reference to `boost::asio::ip::address_v4::address_v4(std::array<unsigned char, 4u> const&)'

按照 GitHub Issue #6721,这个问题可能是因为 std::arrayboost::array 这两个名称的选择在 libtorrent 和 qbittorrent 里面不同,在没有使用 stdc++11 编译的时候,使用的是 boost::array,反之使用 std::array,考虑到 qbittorrent 默认需要 C++ 11,所以 libtorrent 应该使用同样的 CXXFLAGS 编译才能在 linking 的时候不报错。因此既然出现了现在这个问题,就证明 Deluge PPA 的 libtorrent 是没有使用 C++11 编译的。

之前在编译 qb 3.3.16 的时候并没有出现这个错误,可能是 qb3 不要求 C++11 的原因。

那么如果要解决这个问题,就必须从源码开始编译 libtorrent。考虑到 lt1.1.x 至今无法解决 U2 的双栈 IP 汇报问题,因此只能采用 lt1.0。

git clone https://github.com/arvidn/libtorrent.git
cd libtorrent
git checkout $(git tag | grep libtorrent-1_0_ | sort -t _ -n -k 3 | tail -n 1)
./autotool.sh
./configure --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++11

在编译完成之后,checkinstall 安装,然后再去编译 qb 就应该可以了。

关于 Boost 版本

Boost 版本的选择也有一些讲究,Ubuntu Package 默认的是 1.58 版本的 boost,qb 经过测试,最高只能使用 1.65.1 版本的 boost,如果想要使用新一些的版本,只能自己编译。

我在编译 1.65.1 的时候,遇到了一个以前从来没有的问题,找不要 pyconfig.h,这个文件本应该存在于 /usr/include/python 或者 python2.7 或者 python3.5 的目录下(取决于默认 Python 版本),但是我那个 Python 2 就是没有这个文件,因此将 Python 默认改为 3.5(sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 10)才让 boost 的编译器找到对应的 Python 头文件。如果出现这样的问题需要注意。

使用 echo -e '#include <boost/version.hpp>\nBOOST_VERSION' | gcc -x c++ -E - 这个命令可以查看当前 include 的 boost 版本。

Python 版本切换的注意点

如果安装了 Deluge,然后再切换到 Python3,可能会让 Python 找不到 Deluge 的包,然后无法运行,解决方法是修改 /usr/bin/deluged 和 /usr/bin/deluge-web 的第一行,用 python2.7 运行。或者也可以编译完 boost 以后再把默认 python 改回来。

 

发表评论

电子邮件地址不会被公开。