我正在尝试安装dlib
Python库。在某些系统上(macOS,库存Ubuntu 14.04)pip install dlib
工作正常,但在我们的CircleCI环境的Ubuntu 14.x中,它失败并出现以下错误。
Linking CXX shared library dlib.so
/usr/bin/ld: /opt/circleci/python/2.7.11/lib/libpython2.7.a(abstract.o): relocation R_X86_64_32S against '_Py_NotImplementedStruct' can not be used when making a shared object; recompile with -fPIC
error: cmake build failed!
可能出现什么问题?
答案 0 :(得分:14)
问题是Python需要使用--enable-shared
标志进行编译才能成功dlib
安装。虽然在某些情况下系统Python是使用此标志构建的(例如在Ubuntu上),但我们在CI环境中使用的那个是通过pyenv
安装的,默认情况下不会设置它。
解决方案是重新安装pyenv
- 提供的Python,其标志设置如下:
PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install --force 2.7.11
确保使用它:
machine:
python:
version: 2.7.11 # Has to match the pyenv-installed version
答案 1 :(得分:1)
作为一个FYI,通过重命名' /usr/local/lib/libpython2.7.a'解决了我的特殊情况; to' /usr/local/lib/libpython2.7.a.moved'。根据&yum,whatprovides /usr/local/lib/libpython2.7.a'输出,这不是作为通过yum安装的任何软件包的一部分安装的。在这种情况下将其移开,解决了我的问题。
这是我原来的错误消息:
/usr/bin/ld: /usr/local/lib/libpython2.7.a(abstract.o): relocation R_X86_64_32S against `_Py_NotImplementedStruct' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libpython2.7.a:错误添加符号:错误值 collect2:错误:ld返回1退出状态
鉴于我所安装的软件包都没有占用.a lib,将它移到一边是我的选择。
答案 2 :(得分:0)
在Amazon docker容器amazon-linux-python-3.6中为AWS Lambda python 3.6构建matplotlib
(对scikit-image
有依赖性)时,我遇到了类似的问题。
简而言之,matplotlib
的错误与OP对/usr/lib/libpython3.6m.a
的错误相同。原来,在docker容器中有两个这样的库:
find / -name "libpython3.6m.a"
/usr/lib/libpython3.6m.a
/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6m.a
所以我刚刚将/usr/lib/libpython3.6m.a
重命名为其他名称,以便matplotlib
不使用它,并选择了第二个选项:
enter code here
MV /usr/lib/libpython3.6m.a /usr/lib/libpython3.6m.a.moved
此更改后,scikit-image
成功使用了pip3 install --no-binary scikit-image scikit-image
。