为什么安装的 libtorrent 显示导入错误?
Why installed libtorrent shows Import Error?
我在 boost 根文件夹中使用以下命令构建了带有 boost 的 libtorrent :
bootstrap.bat
b2 --hash cxxstd=14 release
并且在我将 BOOST_ROOT 和 BOOST_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.html
和
https://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- 链接类型
- 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 可以是 static 或 shared 但任何设置 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)
抱歉英语不好。 :)
我在 boost 根文件夹中使用以下命令构建了带有 boost 的 libtorrent :
bootstrap.bat
b2 --hash cxxstd=14 release
并且在我将 BOOST_ROOT 和 BOOST_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.html 和 https://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- 链接类型
- 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 可以是 static 或 shared 但任何设置 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)
抱歉英语不好。 :)