2017-03-03 1 views
5

J'essaie d'installer la bibliothèque Python . Sur certains systèmes (macOS, stock Ubuntu 14.04) pip install dlib fonctionne très bien, mais dans le Ubuntu 14.x qui fait partie de notre environnement CircleCI il échoue avec l'erreur suivante.Relocalisation R_X86_64_32S contre '_Py_NotImplementedStruct' ne peut pas être utilisé lors de la création d'un objet partagé; recompiler avec -fPIC

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! 

Qu'est-ce qui pourrait ne pas fonctionner?

Répondre

10

Le problème était que Python doit être compilé avec l'indicateur --enable-shared pour l'installation dlib pour réussir. Alors que dans certains cas le système Python est construit avec ce drapeau (par exemple sur Ubuntu), celui que nous utilisions dans l'environnement CI a été installé via pyenv qui ne le définit pas par défaut.

La solution a été de réinstaller le pyenv -Fourni Python avec le drapeau mis comme ceci:

PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install --force 2.7.11

Pour cela s'utilisé: machine: python: version: 2.7.11 # Has to match the pyenv-installed version

1

En tant Pour votre information, mon cas particulier a été résolu en renommant '/usr/local/lib/libpython2.7.a' en '/usr/local/lib/libpython2.7.a.moved'. Selon la sortie 'yum whatprovides /usr/local/lib/libpython2.7.a', celle-ci n'a pas été installée dans le cadre des paquets installés via yum. Déplacer cela hors de la voie dans ce cas, a résolu mon problème.

Voici était mon message d'erreur d'origine:

/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: Erreur d'ajout de symboles: Valeur incorrecte collect2: Erreur: ld retourné 1 état de sortie

Étant donné qu'aucun de mes paquets installés ne représentait le .a lib, le mettre de côté était une option pour moi.