web-dev-qa-db-fra.com

rails + MySQL sur OSX: la bibliothèque n'est pas chargée: libmysqlclient.18.dylib

Je viens juste de commencer avec Ruby (et Rails). J'ai fait la configuration selon http://Ruby.railstutorial.org/Ruby-on-Rails-tutorial-book#sec:Ruby gems, en utilisant rvm. J'ai tout fonctionne bien avec sqlite. 

Maintenant, j'aimerais essayer de convertir des choses en MySQL, car c'est ce que je fais la plupart de mes développements avec. Dans mon Gemfile, j'ai remplacé sqlite par mysql2:

group :development, :test do
#  gem 'sqlite3', '1.3.5'
  gem 'mysql2'
  gem 'rspec-Rails', '2.9.0'
end

Mais lorsque j'essaie de créer la base de données Rails dans MySQL, je reçois:

$ rake db:create --trace
rake aborted!
dlopen(/Users/username/.rvm/gems/Ruby-1.9.3-p194@Rails3tutorial2ndEd/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle, 9): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/username/.rvm/gems/Ruby-1.9.3-p194@Rails3tutorial2ndEd/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle
  Reason: image not found - /Users/username/.rvm/gems/Ruby-1.9.3-p194@Rails3tutorial2ndEd/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundle

J'ai vu d'autres publications recommandant de réinstaller MySQL via homebrew (le mien a été installé via un fichier DMG téléchargeable), mais je préférerais ne pas le faire car j'ai déjà plusieurs autres bases de données dans d'autres projets non Ruby.

En fait, j'ai le fichier que recherche Rails; il est installé dans /usr/local/mysql/lib/libmysqlclient.18.dylib. Quelle est la meilleure façon de dire à Rails comment le localiser?

111
George Armhold

La solution est assez facile. Ajoutez le chemin de la bibliothèque dans votre fichier ~/.bash_profile ou ~/.profile:

MYSQL=/usr/local/mysql/bin
export PATH=$PATH:$MYSQL
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH

Si cela ne fonctionne toujours pas (cela fonctionne pour moi):

Sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

Il y a beaucoup de blogs avec install_name_tool, ce qui ne fonctionnera pas pour moi car je suis sur OSX Lion:

Sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/bin/indexer
Sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/bin/search
300
atejeda

À El Capitan j'ai eu ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted 

Dans El Capitan, /usr/lib/ a maintenant un drapeau restreint et ne peut pas être écrit sans désactiver la sécurité. Je viens donc de mettre le lien dans /usr/local/lib à la place.

Sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

Le serveur Rails fonctionne à nouveau correctement.

121
TinMonkey

Alors que le titre de cette question décrit précisément le problème que j'ai rencontré, les circonstances sont différentes de celles décrites dans les réponses précédentes, de même que la solution.

Dans mon cas (El Capitan, mysql installé via homebrew), un brew update && brew upgrade provoquait la mise à niveau du paquet mysql vers la version 5.7.10 (à partir de la version 5.6.x).

La mise à niveau a entraîné le remplacement de libmysqlclient.18.dylib par libmysqlclient.20.dylib, mais la gemme mysql2 s’appuyait toujours sur la version précédente.

Pour résoudre le problème que j'ai fait: gem uninstall mysql2 && gem install mysql2

Veuillez noter que des problèmes similaires peuvent survenir avec différentes bibliothèques gérées par homebrew ( voir ma propre réponse à cette question, par exemple )

42
Giuseppe
Sudo ln -s /usr/local/mysql-5.5.25-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

Cela a fonctionné pour moi. J'ai installé MySQL à partir d'un fichier dmg.

25
Joseph
Sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

Travaillé pour moi Tous les semblables n'ont pas.

16
Greg Benner

J'ai rencontré ce problème après une suppression complète puis une nouvelle installation de MySQL. Plus précisément:

Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.20.dylib

Je n'avais même pas touché mon application Rails.

La réinstallation de la gemme mysql2 a résolu ce problème.

$ gem uninstall mysql2
$ gem install mysql2 -v 0.3.18 # (specifying the version found in my Gemfile.lock)

[MySQL 5.7.10, Rails 4.0.0, Ruby 2.0.0, Mac OS X Yosemite 10.10] 

9
sealocal

Si vous utilisez MySQL installé à partir de HomeBrew à El Capitan, vous devez le lier comme suit:

Sudo ln -sf /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
9
arjunswaj

Pour MySql 5.6 installé par DMG sur Mavericks

Sudo ln -s /usr/local/mysql-5.6.14-osx10.7-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
6
Abhishek Pande

Je confirme le correctif d’Abhishek fonctionne .

ça marche aussi pour Yosemite.

note: au lieu de créer un lien vers une version particulière de mysql, utilisez le fait que mysql a déjà construit un lien symbolique

Sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

cette solution fonctionne pour Xcode et C API.

4
ingconti

Pour ceux qui utilisent de la bière. Liez simplement votre version mysql avec l'option "--force". 

brew link mysql56 --force
2
tagaism

Cela fonctionne pour moi:

ln -s /usr/local/Cellar/mysql/5.6.22/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
2
Son

Pour être sûr du lien symbolique nécessaire (dépend de la version de mysql et de la version os):

$ locate libmysqlclient.18.dylib
/usr/local/mysql-5.6.24-osx10.8-x86_64/lib/libmysqlclient.18.dylib

et donc :

ln -s /usr/local/mysql-5.6.24-osx10.8-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
2
Fraide

J'utilise Rails REE (2.3.4) pour un système existant que nous avons. Après la mise à niveau vers El Capitan, l'exécution du script/de la console générait une erreur et mon application ne démarrerait plus (à l'aide de pow):

$ script/console
Loading development environment (Rails 2.3.4)
/blah-blah/gems/activerecord-2.3.4/lib/active_record/connection_adapters/abstract/connection_specification.rb:76:in establish_connection:RuntimeError: Please install the mysql2 adapter: gem install activerecord-mysql2-adapter (dlopen(/blah-blah/gems/mysql2-0.2.19b4/lib/mysql2/mysql2.bundle, 9): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /blah-blah/gems/mysql2-0.2.19b4/lib/mysql2/mysql2.bundle
  Reason: image not found - /blah-blah/gems/mysql2-0.2.19b4/lib/mysql2/mysql2.bundle)


De ce même fil, ci-dessus, j'ai déterminé que j'avais besoin d'émettre cette commande dans le terminal:
Sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Cette commande a généré une erreur: "ln: /usr/lib/libmysqlclient.18.dylib: opération non autorisée". Je n'ai jamais vu cette erreur auparavant.

Après avoir creusé un peu, j'ai trouvé cet article: http://www.macworld.com/article/2986118/security/how-to-modify-system-integrity-protection-in-el-capitan.html et suivez les instructions pour désactiver SIP (la nouvelle protection de l'intégrité du système d'El Capitan). Après avoir désactivé SIP et après le redémarrage, la commande ln a bien fonctionné. Ensuite, j'ai désactivé SIP. Maintenant tout va bien. Mon application s'exécute à nouveau avec pow et aucune erreur n’exécute le script/la console. J'espère que ceci vous aide.

1
GeezerGeek
gem uninstall -aIx

et

bundle install

a travaillé pour moi.

1
atomiccoder

Sous Mac Sierra, si vous utilisez Homebrew, procédez comme suit:

Sudo ln -s /usr/local/Cellar/[email protected]/5.6.34/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
1
Abhishek

J'ai eu ce problème "Bibliothèque non chargée: libmysqlclient.18.dylib" lors de l'importation de MySQLdb depuis MySQL Pour python3

    Traceback (most recent call last):
  File "test.py", line 3, in <module>
    import MySQLdb
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/MySQL_python-1.2.4-py3.5-macosx-10.11-x86_64.Egg/MySQLdb/__init__.py", line 19, in <module>
    import _mysql
ImportError: dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/MySQL_python-1.2.4-py3.5-macosx-10.11-x86_64.Egg/_mysql.cpython-35m-darwin.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/MySQL_python-1.2.4-py3.5-macosx-10.11-x86_64.Egg/_mysql.cpython-35m-darwin.so
  Reason: image not found

La solution fonctionne pour moi: Mac OS X 10.11.1 Python3.5

Edit ~/.bash_profile:
export PATH="/opt/local/Library/Frameworks/Python.framework/Versions/3.5/bin:$PATH"
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
export PATH="/usr/local/mysql/bin:$PATH"
export PATH="/usr/local/mysql/lib:$PATH"
Sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
0
Binh Dang

Après beaucoup de recherches sur Google et d'essayer tout ce qui précède ... la seule chose qui résolve mon problème est cette commande:

$install_name_tool -id /usr/local/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

J'utilise un macbook pro, OSX 10 El Capitan . Darwin xxxx-MacBook-Pro.local 15.6.0 Noyau Darwin version 15.6.0: jeu. 23 juin 18:25:34 HAP 2016; XXX: xnu-3248.60.10 ~ 1/RELEASE_X86_64 x86_64 Perl: v5.18.2 Mysql: 5.6.19

0
Redcloud

utilisez ceci depuis votre ligne de commande:

Sudo install_name_tool -id /usr/local/mysql-connector-c-6.1.3-osx10.7-x86_64/lib/libmysqlclient.18.dylib /usr/local/mysql-connector-c-6.1.3-osx10.7-x86_64/lib/libmysqlclient.18.dylib

essayé sur quelques ordinateurs avec maverick fonctionne toujours

0
toxic

Mon problème avec le chargement de ce fichier bundle était un mauvais lien symbolique. Vérifiez donc le lien et remplacez-le par un nouveau si nécessaire. Tout est tombé en place à ce moment-là. Je ne sais pas comment cela s'est passé, mais c'est ce qui s'est passé. La première fois qu'une erreur de syntaxe s'est produite comme ça. 

0
Rich_F

La seule chose qui a fonctionné pour moi est:

Sudo install_name_tool -change libmysqlclient.18.dylib \
/usr/local/mysql-5.6.23-osx10.8-x86_64/lib/libmysqlclient.18.dylib \
/Library/Ruby/Gems/2.0.0/gems/mysql2-0.4.3/lib/mysql2/mysql2.bundle

Remplacez les chemins de mysql et gems par votre système.

0
Aleksandar Pavić

Si vous utilisez Bitnami RubyStack et rencontrez le problème similaire. Essaye celui-là

Sudo ln -s /Applications/rubystack-2.0.0-17/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
0
noelvictorino

Je travaillais avec la commande Rails g model et j'ai eu cette erreur:

Library not loaded: libmysqlclient.18.dylib

J'ai essayé cela et cela a fonctionné pour moi. J'utilisais Mavericks 10.9.5

Sudo ln -s /usr/local/mysql-5.6.19-osx10.7-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

Merci!

Maintenant, j'utilise Yosemite 10.10.5 et j'ai la même erreur, alors je viens d'exécuter cette commande sur le terminal et elle a été corrigée avec succès.

$ Sudo ln -s /usr/local/mysql-5.6.26-osx10.8-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

aussi vous pouvez essayer:

Sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

Les deux fonctionnent très bien pour moi . J'espère que cela pourrait être utile!

0
Alex Ventura