重定位 R_X86_64_32S 对 '_Py_NotImplementedStruct' 不能在创建共享对象时使用;使用 -fPIC 重新编译

Relocation R_X86_64_32S against '_Py_NotImplementedStruct' can not be used when making a shared object; recompile with -fPIC

我正在尝试安装 dlib Python 库。在某些系统上(macOS,股票 Ubuntu 14.04)pip install dlib 工作正常,但在 Ubuntu 14.x 这是我们 CircleCI 环境的一部分,它失败并出现以下错误。

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!

有什么问题吗?

问题是 Python 需要使用 --enable-shared 标志编译才能使 dlib 安装成功。虽然在某些情况下系统 Python 是使用此标志构建的(例如在 Ubuntu 上),但我们在 CI 环境中使用的是通过 pyenv 安装的不要默认设置。

解决方案是重新安装 pyenv-provided 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

仅供参考,我的特殊情况已通过将“/usr/local/lib/libpython2.7.a”重命名为“/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 个退出状态

鉴于我安装的软件包中有 none 个包含 .a 库,我可以选择将其移到一边。

我在为 aws lambda python 3.6 在亚马逊 docker 容器 amazon-linux-python-3.6 中构建 matplotlibscikit-image 的依赖项)时遇到了类似的问题。 =21=]

简而言之,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 heremv /usr/lib/libpython3.6m.a /usr/lib/libpython3.6m.a.moved

此更改后,scikit-image 使用 pip3 install --no-binary scikit-image scikit-image 成功。