**
*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/
有关如何解决此问题的任何建议?
答案 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客户端的最简单方法是什么。 预先感谢。