ImportError: /usr/local/lib/python3.7/site-packages/P4API.cpython-37m-x86_64-linux-gnu.so: undefined symbol: SSL_library_init
ImportError: /usr/local/lib/python3.7/site-packages/P4API.cpython-37m-x86_64-linux-gnu.so: undefined symbol: SSL_library_init
**
*File "/usr/local/lib/python3.7/site-packages/P4.py", line 410, in <module>
import P4API
ImportError: /usr/local/lib/python3.7/site-packages/P4API.cpython-37m-x86_64-linux-gnu.so: undefined symbol: SSL_library_init*
**
我在 运行 docker 容器和安装 p4python 以连接 Perforce 服务器时遇到上述错误。在 Debian 映像上安装 p4python 失败。所以我现在尝试了 CentOS。
在日志中说包已安装。我遇到这个问题有一段时间了,但我通过在网上找到 P4API.cpp 的正确版本并手动放置它,在 Windows 上解决了它。
在 docker 构建期间安装 p4python 时的日志显示:
*Building wheels for collected packages: p4python, SQLAlchemy, pycparser
Building wheel for p4python (setup.py): started
Building wheel for p4python (setup.py): finished with status 'done'*
perforce 论坛最近对此有疑问,但没有解决方案。
https://forums.perforce.com/index.php?/topic/5933-p4python-undefined-symbol-ssl-library-init/
关于如何解决这个问题有什么建议吗?
我也 运行 关注这个问题 - 在 Debian Buster 上使用 Python 2.7 x86_64。
TL;DR 预加载存根以填充缺失的符号是一种可能的解决方法(对我有用!):
LD_PRELOAD=~/stub.so python -c "import P4"
我自己编译的,你可以从https://www.dropbox.com/s/j9bongx094dwf6u/stub.so?dl=0
获取
详细解释:
这是因为较新发行版中的 libssl 缺少旧版 libssl 中的某些符号,而 Perforce 提供的二进制文件仍然引用它们(具体来说,netssltransport.o in librpc.a out of ftp://ftp.perforce.com/perforce/r18.2/bin.linux26x86_64/p4api-glibc2.12.tgz)
虽然我认为不需要这些符号,所以您可以将它们存根:
stub.c:
void SSLv23_method() {};
void SSLeay() {};
void SSL_load_error_strings() {};
gcc -shared -o stub.so stub.c
我下载了 p4python 并用 "tar xzf p4python.tgz" 解压。
我认为该软件包没有找到我猜的 ssl 库文件的正确位置。
因此,包含在 Dockerfile 中。
RUN ln -nfs /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 /usr/lib/x86_64-linux-gnu/libssl.so
错误已解决。
在相关说明中,在构建映像时在 docker 容器中安装 p4 客户端的最简单方法是什么。
提前致谢。
我也遇到过这种问题。
起初我查看了P4API使用的libssl.so
版本:
ldd /home/someuser/.local/lib/python3.5/site-packages/P4API.cpython-35m-x86_64-linux-gnu.so
我意识到 P4API 指向 libssl.so.1.1
,这对于 Perforce API 来说太高了。正如 documentation's OpenSSL Compatibility 中所述,您最多可以使用 1.0.2k+
.
我使用以下方法在 Debian 9 上安装了 libssl 1.0.2
:
sudo apt-get install libssl1.0.2
并通过 linking 指向该版本进行全新安装:
ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 /some/path/libssl.so
pip3 uninstall p4python
pip3 install --install-option="--ssl" --install-option="/some/path/" p4python
其中 /some/path/
指的是您要将 link 库指向的位置。
**
*File "/usr/local/lib/python3.7/site-packages/P4.py", line 410, in <module>
import P4API
ImportError: /usr/local/lib/python3.7/site-packages/P4API.cpython-37m-x86_64-linux-gnu.so: undefined symbol: SSL_library_init*
**
我在 运行 docker 容器和安装 p4python 以连接 Perforce 服务器时遇到上述错误。在 Debian 映像上安装 p4python 失败。所以我现在尝试了 CentOS。 在日志中说包已安装。我遇到这个问题有一段时间了,但我通过在网上找到 P4API.cpp 的正确版本并手动放置它,在 Windows 上解决了它。
在 docker 构建期间安装 p4python 时的日志显示:
*Building wheels for collected packages: p4python, SQLAlchemy, pycparser
Building wheel for p4python (setup.py): started
Building wheel for p4python (setup.py): finished with status 'done'*
perforce 论坛最近对此有疑问,但没有解决方案。 https://forums.perforce.com/index.php?/topic/5933-p4python-undefined-symbol-ssl-library-init/
关于如何解决这个问题有什么建议吗?
我也 运行 关注这个问题 - 在 Debian Buster 上使用 Python 2.7 x86_64。
TL;DR 预加载存根以填充缺失的符号是一种可能的解决方法(对我有用!):
LD_PRELOAD=~/stub.so python -c "import P4"
我自己编译的,你可以从https://www.dropbox.com/s/j9bongx094dwf6u/stub.so?dl=0
获取详细解释:
这是因为较新发行版中的 libssl 缺少旧版 libssl 中的某些符号,而 Perforce 提供的二进制文件仍然引用它们(具体来说,netssltransport.o in librpc.a out of ftp://ftp.perforce.com/perforce/r18.2/bin.linux26x86_64/p4api-glibc2.12.tgz)
虽然我认为不需要这些符号,所以您可以将它们存根:
stub.c:
void SSLv23_method() {};
void SSLeay() {};
void SSL_load_error_strings() {};
gcc -shared -o stub.so stub.c
我下载了 p4python 并用 "tar xzf p4python.tgz" 解压。
我认为该软件包没有找到我猜的 ssl 库文件的正确位置。 因此,包含在 Dockerfile 中。
RUN ln -nfs /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 /usr/lib/x86_64-linux-gnu/libssl.so
错误已解决。 在相关说明中,在构建映像时在 docker 容器中安装 p4 客户端的最简单方法是什么。 提前致谢。
我也遇到过这种问题。
起初我查看了P4API使用的libssl.so
版本:
ldd /home/someuser/.local/lib/python3.5/site-packages/P4API.cpython-35m-x86_64-linux-gnu.so
我意识到 P4API 指向 libssl.so.1.1
,这对于 Perforce API 来说太高了。正如 documentation's OpenSSL Compatibility 中所述,您最多可以使用 1.0.2k+
.
我使用以下方法在 Debian 9 上安装了 libssl 1.0.2
:
sudo apt-get install libssl1.0.2
并通过 linking 指向该版本进行全新安装:
ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2 /some/path/libssl.so
pip3 uninstall p4python
pip3 install --install-option="--ssl" --install-option="/some/path/" p4python
其中 /some/path/
指的是您要将 link 库指向的位置。