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!
何が悪いのでしょうか?
問題は、dlib
インストールを成功させるにはPythonを--enable-shared
フラグでコンパイルする必要があることでした。場合によってはシステム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つの終了ステータスを返しました
インストールされたパッケージのいずれも.alibを考慮していなかったことを考えると、それを脇に移動することは私にとっての選択肢でした。
Amazondockerコンテナー内でawslambda python 3.6 Amazon-linux-python-)のmatplotlib
(scikit-image
の依存関係)をビルドするときに同様の問題が発生しました3.6 。
つまり、matplotlib
はOPが/usr/lib/libpython3.6m.a
に対して持っていたのと同じエラーを出していました。 Amazondockerコンテナにはそのようなライブラリが2つあることが判明しました。
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
が使用しないようにし、2番目のオプションを選択しました。
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
を使用して成功しました。