3

**

*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。在日志中说软件包已安装。这个问题我已经有一段时间了,但我在 Windows 上通过在线查找正确版本的 P4API.cpp 并手动放置它来解决它。

在 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/

关于如何解决这个问题的任何建议?

4

3 回答 3

2

我也遇到过这样的问题。

起初我检查libssl.so了 P4API 使用的版本:

ldd /home/someuser/.local/lib/python3.5/site-packages/P4API.cpython-35m-x86_64-linux-gnu.so

我意识到 P4API 指向的libssl.so.1.1对于 Perforce API 来说太高了。正如文档的 OpenSSL 兼容性中所述,您最多可以使用1.0.2k+.

我使用以下方法安装libssl 1.0.2在 Debian 9 上:

sudo apt-get install libssl1.0.2

并通过链接全新安装指向该版本:

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

Where/some/path/是指要将库链接到的位置。

于 2019-03-26T10:34:58.650 回答
0

我也遇到了这个问题——在 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 提供的二进制文件仍然引用它们(特别是ftp://ftp.perforce.com/perforce/中 librpc.a 中的 netssltransport.o r18.2/bin.linux26x86_64/p4api-glibc2.12.tgz )

我不认为这些符号是必需的,所以你可以把它们存起来:

存根.c:

void SSLv23_method() {};
void SSLeay() {};
void SSL_load_error_strings() {};

gcc -shared -o stub.so stub.c

于 2019-03-11T19:18:16.910 回答
0

我下载了 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 客户端的最简单方法是什么。提前致谢。

于 2019-03-19T07:17:28.203 回答