重定位 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 中构建 matplotlib
(scikit-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 here
mv /usr/lib/libpython3.6m.a /usr/lib/libpython3.6m.a.moved
此更改后,scikit-image
使用 pip3 install --no-binary scikit-image scikit-image
成功。
我正在尝试安装 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 中构建 matplotlib
(scikit-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 here
mv /usr/lib/libpython3.6m.a /usr/lib/libpython3.6m.a.moved
此更改后,scikit-image
使用 pip3 install --no-binary scikit-image scikit-image
成功。