重新定位R_X86_64_32S反对' _Py_NotImplementedStruct'制作共享对象时不能使用;用-fPIC重新编译

时间:2017-03-03 15:27:25

标签: python dlib

我正在尝试安装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!

可能出现什么问题?

3 个答案:

答案 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