media-scientific - IT Blog

the backend developers blog

lazy symbol binding failed: Symbol not found: _mysql_init

Vorlesen mit webReader

Die Installation von Ruby on Rails in Kombination mit dem gem mysql gestaltet sich recht kompliziert. So ist die normale Installation mit dem Befehl

sudo gem install mysql

schon mal nicht durchzuführen und man erhält die folgende Fehlermeldung:

Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
    ERROR: Failed to build gem native extension.
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb install mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... no
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.
Provided configuration options:
    --with-opt-dir
    --without-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
    --with-mysql-config
    --without-mysql-config
    --with-mysql-dir
    --without-mysql-dir
    --with-mysql-include
    --without-mysql-include=${mysql-dir}/include
    --with-mysql-lib
    --without-mysql-lib=${mysql-dir}/lib
    --with-mysqlclientlib
    --without-mysqlclientlib
    --with-mlib
    --without-mlib
    --with-mysqlclientlib
    --without-mysqlclientlib
    --with-zlib
    --without-zlib
    --with-mysqlclientlib
    --without-mysqlclientlib
    --with-socketlib
    --without-socketlib
    --with-mysqlclientlib
    --without-mysqlclientlib
    --with-nsllib
    --without-nsllib
    --with-mysqlclientlib
    --without-mysqlclientlib
Gem files will remain installed in /Library/Ruby/Gems/1.8/gems/mysql-2.7 for inspection.
Results logged to /Library/Ruby/Gems/1.8/gems/mysql-2.7/gem_make.out

Dies liegt an der Tatsache, dass hier die korreckten Umgebungsvariablen mit einbezogen werden müssen. Dies ist auch in der Datei config/databae.yml zu lesen, insofern diese für MySQL mit erstellt wurde.

# On Mac OS X Leopard:
#   sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
#       This sets the ARCHFLAGS environment variable to your native architecture

Gibt man nun also an Stelle von gem install mysql die folgende Sytax ein:

sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config

wird der Aufruf mit einer Erfolgsmeldung quittiert.

Soweit dieses erstmal… nur leider erhält man nun den Fehler:

dyld: lazy symbol binding failed: Symbol not found: _mysql_init
  Referenced from: /Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle
  Expected in: dynamic lookup
dyld: Symbol not found: _mysql_init
  Referenced from: /Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle
  Expected in: dynamic lookup
Trace/BPT trap

der einem nicht gerade weiter hilft.

Nach stundenlanger Recherche auf verschiedenen Blogs wird schnell klar, man ist mit dem Problem nicht allein und (viel schlimmer) die dort beschriebenen Lösungsansätze funktionieren nicht. So wird teilweise vorgeschlagen eine der mysql.bundle Files zu löschen, was jedoch auch nichts an der Situation ändert (auch wenn tatsache eine doppelt existiert).

Wo ist also das Problem?!: Ruby, bzw. weitere Komponenten die das besagte Gem, mag einfach nicht mit einer 64Bit-Version von MySQL zusammen arbeiten. Nur auf eine 32Bit Version zu wechseln kann nicht in Frage kommen, schließlich hat man ja viel Geld für seinen Mac ausgegeben und ist stolz auf die Intel-Architektur darin…

Also hier das weitere Vorgehen:

  • von http://www.mysql.de/ die 32BIT Version downloaden und installieren.

hier das File für Mac OS X 10.5 (x86) wählen (nicht wieder die 64BIT Version). Vorher sollte man zur Sicherheit noch alle Datenbanken Backuppen. Dies kann mit folgendem Befehl gemacht werden:

mysqldump -u root -p -h localhost --all-databases > backup_all_databases.sql

Weiter geht is mit der Installation von MySQL:

Zuerst sollten alle Instanzen von MySQL beendet werden… da ich aus der Linux-Welt komme, mache ich das per

ps -ela | grep mysql
sudo kill <PID>

Dann kann der Installer per Doppelklick gestartet werden…

  • Die 32er Version mit der 64er verheirattten (ich weiß, es ist keine Hochzeit :-) )

Unter /usr/local sollten nun die beiden Versionen auffindbar sein:

mysql-5.0.67-osx10.5-x86_64    mysql-5.1.32-osx10.5-x86

und ein

ls -all

zeigt, dass die Installationsroutine den Symlink auf die 32Bit Version gesetzt hat.

mysql -> mysql-5.1.32-osx10.5-x86

Dies sollten wir rückgängig machen, weil wir schließlich MEHR POWER wollen.

sudo ln -s mysql-5.0.67-osx10.5-x86_64 mysql

Anschließen die 32-Bit Version zusätzlich verlinken:

sudo ln -s mysql-5.1.32-osx10.5-x86 mysql32

Warscheinlich müsst ihr vorher noch den alten bestehenden Symlink löschen… sudo rm mysql

Jetzt wird das gem nochmal installiert. Diesmal mit dem Pfad der 32BIT Variante:

sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql32/bin/mysql_config

Nur leider ist in der Datei mysql.bundle nun ein Hart-codierter Pfad gesetzt… Nach diesem HowTo hier, soll die Datei unter /Library/Ruby/Gems/1.8/gems/mysql2.7/lib/mysql.bundle editiert werden und die unter /Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle soll gelöscht werden.

Das funktioniert nur leider nicht. Also nehme man einen HexEditor (http://www.suavetech.com/0xed/0xed.html) und editiere zuerst die Datei unter /Library/Ruby/Gems/1.8/gems/mysql2.7/lib/mysql.bundle. Es gibt bei dem Tool eine Suchen funktion, die sich anbietet!

Hier muss nun der Pfad von /usr/local/mysql/… auf /usr/local/mysql32/… geändert werden. Die Datei dann auf dem Desktop speichern und in BEIDE Pfade kopieren.

sudo cp /Users/my_home/Desktop/mysql.bundle  /Library/Ruby/Site/1.8/universal-darwin9.0/
sudo cp /Users/my_home/Desktop/mysql.bundle /Library/Ruby/Gems/1.8/gems/mysql-2.7/lib

Anschließen packen wir unser anfänglich gemachtes Datenbankbackup wieder an den Ort, an dem es gehört:

mysql -u root -p < backup_all_databases.sql

Ein rake db:migrate sollte Erfolg bringen!

Ich hoffe das die Macher des mysql Gems in Zukunft auch die 64BIT Version verwenden. Dieser Installationsprozess ist alles andere als schön.

Leave a Reply

You must be logged in to post a comment.