web-dev-qa-db-fra.com

libsystem_symptoms.dylib manquant dans Xcode 8

Je viens de mettre à jour Xcode 8 et je ne peux plus créer d'applications basées sur xml2. Si je construis un fichier simple et essayez de le construire comme suit:

c++ myapp.cc `xml2-config --cflags` `xml2-config --libs`

...Je reçois le message d'erreur suivant:

ld: file not found: /usr/lib/system/libsystem_symptoms.dylib for architecture x86_64

Peu importe ce que contient myapp.cc (le mien est simplement une routine principale qui renvoie 0). Le problème fondamental semble être que Apple a supprimé /usr/lib/system/libsystem_symptoms.dylib dans Xcode 8, mais de nombreux fichiers .tbd dans /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/ Les SDK/MacOSX10.12.sdk/usr/lib le pointent toujours. Quelqu'un d'autre a-t-il rencontré un problème comme celui-ci?

16
Michael McFarlane

@mnencia answer supprime les références à libsystem_symptomps.dylib, mais a échoué pour moi sous OS X. Les modifications suivantes devraient lui permettre de fonctionner sous OS X:

Sudo /usr/bin/sed -i.backup -E -e 's@/usr/lib/system/libsystem_symptoms.dylib(, )?@@' \
$(grep -ril /usr/lib/system/libsystem_symptoms.dylib \
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/lib)

J'espère que cela aide les développeurs Mac.

15
Raymond Naseef

Jusqu'à ce que Xcode8 se stabilise, je conserve Xcode7.3, renommé en

/Applications/Xcode7.3.app/

Généralement j'utilise Xcode8 qui est dans

/Applications/Xcode.app/

mais quand je rencontre de telles erreurs, j’ai la possibilité de

Sudo xcode-select -switch /Applications/Xcode7.3.app/

Cela a guéri l'erreur

ld: file not found: /usr/lib/system/libsystem_symptoms.dylib for architecture x86_64

pour moi, lors de la tentative d'installation d'un paquet R:

> install.packages('clickstream')

3
Chris Hanning

C'est un bug de XCode 8.

En attendant un correctif correct de la part d’Apple, la commande suivante supprime la référence à la bibliothèque manquante des fichiers tbd.

Sudo /usr/bin/sed -i.backup 's@/usr/lib/system/libsystem_symptoms.dylib\(, \)\?@@' \
  $(grep -ril /usr/lib/system/libsystem_symptoms.dylib \
    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/lib)

Je ne sais pas si cela fonctionnera pour tous les types de construction, mais il a été résolu que tout ne fonctionnait pas pour moi.

3
mnencia

Un correctif que j'ai utilisé, qui évite toute utilisation de Sudo, consiste simplement à filtrer les éléments -L/Applications/Xcode.app/Sommaire/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12. drapeau sdk/usr/lib. Dans un fichier makefile GNU, vous pouvez le faire à l'aide de la commande filter-out. Donc, si je construis une variable LINK_LIBS, qui comprend $ (Shell xml2-config --libs), je peux alors filtrer LINK_LIBS avec la commande suivante:

LINK_LIBS := $(filter-out -L$(Shell xcrun --show-sdk-path)/usr/lib, $(LINK_LIBS))

Si j'utilise seulement xml2-config, je peux aussi simplement ajouter un argument "--exec-prefix =/usr" lorsque je l'appelle:

c++ myapp.cc `xml2-config --cflags` `xml2-config --exec-prefix=/usr --libs`

Je ne sais pas quels sont les effets secondaires potentiels de la suppression du chemin du SDK de la chaîne de recherche de la bibliothèque, mais pour le moment, ces solutions semblent fonctionner pour toutes mes applications.

2
Michael McFarlane

La réponse de @ mnencia presque a fonctionné pour moi, mais la commande sed n'a rien remplacé dans les fichiers TLB - les sauvegardes étaient identiques aux fichiers modifiés.

J'ai exécuté cette partie de sa commande: grep -ril /usr/lib/system/libsystem_symptoms.dylib /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/lib  

Qui a identifié les fichiers référençant la bibliothèque supprimée et les a modifiés à la main. 

YMMV

1
John Naegle

Pour les personnes mal à l'aise avec le retrait des références à libsystem_symptoms.dylib de divers emplacements, j'ai proposé une autre solution qui serait le contraire de la suppression des références: l'ajout d'un faux libsystem_symptoms.dylib vide dans /usr/lib/system

mkdir ~/src/libempty
cd ~/src/libempty
touch empty.c
cc -dynamiclib empty.c -o libempty.dylib
Sudo cp libempty.dylib /usr/local/lib/libempty.dylib
cd /usr/lib/system
Sudo ln -s /usr/local/lib/libempty.dylib libsystem_symptoms.dylib

Sauf que ... cette dernière étape ne fonctionne pas à cause de OS X/macOS Protection de l'intégrité du système

Il y a apparemment plus d'un moyen de contourner cela. vous pouvez le désactiver en utilisant csrutil et en redémarrant (voir la question Opération non autorisée à la racine El capitan ). Je ne veux pas vraiment le désactiver (ou oublier de le réactiver), alors j'ai démarré en recovery mode , puis j'ai ouvert une fenêtre de terminal et terminé le travail de cette façon:

cd /Volumes
cd MyHardDrive
cd usr/lib/system
ln -s ../../local/lib/libempty.dylib libsystem_symptoms.dylib

Avant cela, j’essayais de compiler PostgreSQL 9.6 sur El Capitan et j’obtenais cette erreur d’éditeur de liens ("ld: file not found: /usr/lib/system/libsystem_symptoms.dylib") à l’étape configure lorsqu’elle vérifiait les bibliothèques readline ou zlib. Après cela, PostgreSQL a configuré et construit en douceur!

0
Weston C