From: Justin Rudd Date: 2004-09-10T04:55:50+09:00 Subject: Ruby on Windows Is it just me, or is getting anything other than standard ruby a true ordeal on Windows? Now I'm sure everyone is snickering right about now, that's OK. Anyway, I'm trying to write a product using Ruby that will be downloaded and run locally. I need to support different databases. MySQL has native Windows binaries. Looking for Ruby bindings to MySQL led me to http://www.tmtm.org/en/mysql/ruby/. So I download the archive, extract it, run ruby extconf.rb, and it stops there. It can't find mysql_query in any of the library paths that it looks at. So I look at the log file and see that it is basically generate mini-C programs and if they compile, the stuff is there. On Windows, there is a mysqlclient.lib file that it is trying to link to. Hm...why would it still show up unresolved? Fast forward 3 hours of digging through mkmf to figure out how it is generating paths... Screw this. I'll just generate the C file myself and write my own project to generate the library. That wasn't too hard. Got the project going. Got the shared library compiled. Hm...where do I put the file? Ah...I put it in the i386-msvcrt directory in site_ruby. Hm...everything in there is a .so file. OK...I'll rename mine to mysql.so (is this necessary?) Now I'll go and do this - require 'mysql' Run this through the interpreter... Get this... C:/shared/tools/sdks/ruby/lib/ruby/1.8/i386-mswin32/mysql.so: 127: The specified procedure could not be found. - Init_mysql (LoadError) C:/shared/tools/sdks/ruby/lib/ruby/1.8/i386-mswin32/mysql.so from connect.rb:1 Look at my C project, Init_mysql does exist. But it isn't exported. In the Windows world, I have to export functions from DLLS. So that things like GetProcAddress work. So I start off by exporting the one method. Rerun the interpreter, no errors. WOOHOO!!! So I extend the script to this... require 'mysql' c = Mysql.new('localhost', 'root', 'my_root_password') c.list_dbs.each { |db| p db } I get a list of all Databases in MySQL instance. Try some inserts, deletes, etc. Everything seems to be working. Now here are my problems - * This took 6 hours * extconf gave me no ideas that it required a C compiler * extconf gave me no ideas what was going wrong (I just got a no) I'm a pretty decent Windows programmer (been doing it for 10+ years now). And I think I've got to go through the whole process again to get Ruby DBI working and SQLLite/Ruby (which I probably won't use since it is GPL). And PostgresQL. But for someone starting out with Ruby on Windows, would they know they needed a C compiler? Would they know they needed to add __declspec(dllexport) to that one function? Now let's contrast this with Python. I go to http://sourceforge.net/projects/mysql-python/ and they have an EXE I can download, run it, and I can connect to MySQL in under 5 minutes (after download). I love Ruby. And a lot of that love comes from Rails (which I've been using quite successfully). But building an app is harder than it should be. I'm going to document what I did and post it on my weblog along with the binary file that I generated. Hopefully someone else out there can make use of it. -- Justin Rudd http://seagecko.org/thoughts/