ImportError:/usr/local/lib/python3.7/site-packages/P4API.cpython-37m-x86_64-linux-gnu.so:未定义符号:SSL_library_init

时间:2019-03-07 11:05:46

标签: linux docker perforce p4python

**

*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容器并安装用于连接Perforce服务器的p4python时出现上述错误。在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/

有关如何解决此问题的任何建议?

3 个答案:

答案 0 :(得分:2)

我也遇到过这样的问题。

首先,我检查了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

,并通过链接进行全新安装以指向该版本:

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/指向您要将lib链接到的位置。

答案 1 :(得分: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/r18.2/bin.linux26x86_64/p4api-glibc2.12.tgz中librpc.a中的netssltransport.o)

我认为这些符号不是必需的,因此您可以将它们存根:

stub.c:

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

gcc -shared -o stub.so stub.c

答案 2 :(得分: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客户端的最简单方法是什么。 预先感谢。

相关问题