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 库指向的位置。