为什么安装的 libtorrent 显示导入错误?

Why installed libtorrent shows Import Error?

我在 boost 根文件夹中使用以下命令构建了带有 boost 的 libtorrent :

bootstrap.bat
b2 --hash cxxstd=14 release

并且在我将 BOOST_ROOTBOOST_BUILD_PATH 添加到 PATH变量。

我也下载了 OpenSSL 并构建它,然后分别复制到 Visual studio 15 2017 编译器包含和 libs 文件夹。

接下来在 libtorrent 根文件夹中我有 运行 这个命令:

b2 variant=release link=shared
b2 install --prefix=build

构建成功,libtorrent c++ 库已创建。

然后我有 运行 这些命令:

py setup.py build
py setup.py install

他们执行时没有错误,并且在我的 python 中安装了 libtorrent libs/site-packages 文件夹。但是当我导入它时,这个错误显示:

Python导入错误 []

我可能做错了什么构建步骤?

Os : Windows 10 x64

Python : 3.9.5 x64

Libtorrent:2.0.5

提升:1.78.0

我关注了 libtorrent 文档: https://libtorrent.org/building.htmlhttps://www.libtorrent.org/python_binding.html

我做了什么?

基本如下:https://github.com/arvidn/libtorrent/blob/master/docs/building.rst#downloading-and-building

解压boost_1_78_0.zip到D:\boost_1_78_0,运行:

set BOOST_ROOT=D:\boost_1_78_0
set BOOST_BUILD_PATH=%BOOST_ROOT%\tools\build
(cd %BOOST_ROOT% && .\bootstrap.bat)
echo using msvc ; >>%HOMEDRIVE%%HOMEPATH%\user-config.jam
%BOOST_ROOT%\b2.exe --hash release

之后我得到:

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

D:\boost_1_78_0

The following directory should be added to linker library paths:

D:\boost_1_78_0\stage\lib

我认为这是我开始失败的地方,我第一次没有读到这个,现在我问自己 where/how 是否应该设置“编译器包含路径”和“链接器库路径” .?

尝试编译 libtorrent 时,使用您提供的命令行 (b2 msvc-14.2 variant=release link=static runtime-link=static debug-symbols=on),我得到:

CXXFLAGS =
LDFLAGS =
OS = NT
building boost from source directory:  D:/boost_1_78_0
Performing configuration checks

    - default address-model    : 64-bit (cached) [1]
    - default architecture     : x86 (cached) [1]

[1] msvc-14.2
...patience...
...patience...
...patience...
...found 3888 targets...
...updating 78 targets...
compile-c-c++ bin\msvc-14.2\release\cxxstd-14-iso\debug-symbols-on\link-static\runtime-link-static\threading-multi\src\hasher.obj
hasher.cpp
D:\TEMP\libtorrent\libtorrent\include\libtorrent/hasher.hpp(66): fatal error C1083: Cannot open include file: 'openssl/sha.h': No such file or directory

    call "bin\standalone\msvc\msvc-14.2\msvc-setup.bat"  >nul
 cl /Zm800 -nologo "src\hasher.cpp" -c -Fo"bin\msvc-14.2\release\cxxstd-14-iso\debug-symbols-on\link-static\runtime-link-static\threading-multi\src\hasher.obj"     -TP /bigobj /wd4251 /wd4268 /wd4275 /wd4373 /wd4503 /wd4675 /EHs /std:c++14 /GR /Zc:throwingNew /O2 /Z7 /Ob2 /W4 /MT /Zc:forScope /Zc:wchar_t /Zc:inline /Gw /favor:blend -DBOOST_ALL_NO_LIB -DBOOST_ASIO_ENABLE_CANCELIO -DBOOST_ASIO_HAS_STD_CHRONO -DBOOST_ASIO_NO_DEPRECATED -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_NO_DEPRECATED -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_SYSTEM_STATIC_LINK=1 -DNDEBUG -DOPENSSL_NO_SSL2 -DTORRENT_BUILDING_LIBRARY -DTORRENT_SSL_PEERS -DTORRENT_USE_I2P=1 -DTORRENT_USE_LIBCRYPTO -DTORRENT_USE_OPENSSL -DWIN32 -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_FILE_OFFSET_BITS=64 -D_SCL_SECURE_NO_DEPRECATE -D_WIN32 -D_WIN32_WINNT=0x0600 -D__USE_W32_SOCKETS "-ID:\boost_1_78_0" "-Ideps\try_signal" "-Iinclude" "-Iinclude\libtorrent" 

...failed compile-c-c++ bin\msvc-14.2\release\cxxstd-14-iso\debug-symbols-on\link-static\runtime-link-static\threading-multi\src\hasher.obj...
compile-c-c++ bin\msvc-14.2\release\cxxstd-14-iso\debug-symbols-on\link-static\runtime-link-static\threading-multi\src\merkle.obj
merkle.cpp
D:\TEMP\libtorrent\libtorrent\include\libtorrent/hasher.hpp(66): fatal error C1083: Cannot open include file: 'openssl/sha.h': No such file or directory
..... (rest of logging removed)

我找到了答案。

构建 libtorrent python 绑定 2 个因素很重要:

1- openSSL 版本 2- 链接类型

  1. python 附带 openssl v.1.1(或基于 python 版本的类似版本),如果构建 python 与 openssl v.1.1 绑定(这是最新版本,而我正在写作)一个依赖解决否则,如果使用 openssl v.3 构建 2 依赖必须添加到 python 它们是:
// 32 or 64 bits library based on openssl build

libssl-3-x64.dll
libcrypto-3-x64.dll

2 ) 在构建时 python 绑定 2 个命令可以使用:

a ) 使用默认参数很简单:

py setup.py build
py setup.py install

在这种情况下,默认 libtorrent 和 boost-python 链接 static

b ) 具有更多控制的复杂的(我认为):

py setup.py build_ext --b2-args="VARS" install

在 VARS 的地方我们可以写 boost 构建选项,但这些是我们想要的:

libtorrent-link=TYPE  boost-link= TYPE

TYPE 可以是 staticshared 但任何设置 shared ,它成为依赖。需要的两个文件是:

// 32 and 64 bits file may have different name
// files can have different names but they are similar to below

torrent-rastarbar.dll
boost_python(PYTHON-VERSION)(SOME-INFO).dll

boost python可以在stage/lib.[=16中的boost根目录下找到=]

请注意,您必须为此解决方案构建 boost 和 libtorrent SHARED。

结论:

如上所述,必须根据您所做的构建设置添加这些依赖项:

1 - OpenSSL 库 2 - 提升 python 3 - libtorrent 库

有些论坛和讨论中提到了一个可选文件msvcr90.dll,它对我的​​项目没有影响,但很好指出。

将这些文件放到 python 解释器可以找到的目录中,或者将项目放入您的文件夹并添加这段代码 在导入 libtorrent 之前:

import os

current_path = os.path.abspath(".")

# do not pass relative path like ".", pass full path

os.add_dll_directory(current_path)

抱歉英语不好。 :)