たむらです。続き。
$ rubymg -v
ruby 1.6.6 (2001-12-26) [i686-mingw32]
TeraTerm の terminal を SJISにすると、
$ rubymg test.rb
test.rb:11:in `require': 193: %1 は有効な Windows NT アプリケーションではありません。
- ./mysql.so (LoadError)
from test.rb:11
$ cat -n test.rb
1 # This is script to test for mysql-ruby module.
2 # $Id: test.rb,v 1.5 2002/01/07 01:17:28 tommy Exp $
3 #
4 # Execute in mysql-ruby top directory.
5 # Modify following $host, $user, $passwd and $db if needed.
6 # $host: hostname mysql running
7 # $user: mysql username (not unix login user)
8 # $passwd: mysql access passwd for $user
9 # $db: database name for this test. it must not exist
before testing.
10
11 require "./mysql.o"
12
13 $host = ARGV.shift
14 $user = ARGV.shift
:snip
mysql.so がおかしいのか ?
$ objdump -p mysql.so|grep 'DLL Name:'
DLL Name: msvcrt.dll
DLL Name: msvcrt.dll
DLL Name: ADVAPI32.DLL
DLL Name: KERNEL32.dll
DLL Name: USER32.dll
DLL Name: WSOCK32.DLL
DLL Name: ruby.exe
ruby.exe が入ってるのはマズイっすね。rubymg -> /usr/local/mingw/bin/ruby.exe
で PATH に入ってないので、 mysql.so が見つけられないのが原因か。
cmd.exe で実行すると、何度か作ってるうちにインストールされた
e:\usr\local\bin\ruby.exeがあったと。(PATH に含まれる)
ちなみに、添付拡張ライブラリは
$ objdump -p /usr/local/mingw/lib/ruby/1.6/i686-mingw32/Win32API.so \
| grep 'DLL Name:'
DLL Name: KERNEL32.dll
DLL Name: mingw32-ruby16.dll
$ objdump -p /usr/local/mingw/lib/ruby/1.6/i686-mingw32/digest.so |grep 'DLL Name:'
DLL Name: msvcrt.dll
DLL Name: mingw32-ruby16.dll
うーん、どこでしくったのか。やはり、extconf.rb(mkmf.rb)を追わなきゃ。
# しかし、find_library('mysqlclient', 'mysql_query', lib, "#{lib}/mysql") が
OK にならない。
結局、試行錯誤して
cat extconf.rb
require 'mkmf'
inc, lib = dir_config('mysql', '/usr/local')
have_library('z')
have_library('wsock32')
# find_library('mysqlclient', 'mysql_query', lib, "#{lib}/mysql") or exit 1
have_library('mysqlclient')
# If you have error such as 'undefined symbol', delete '#' mark follow
# lines:
#have_library('m')
have_header('mysql.h') or have_header('mysql/mysql.h') or exit 1
create_makefile("mysql")
にすると、生成された Makefileでそのまま、mysql.soが出来ました。
.so を作るところは、
dllwrap --target=mingw32 --as=as --dlltool-name=dlltool --driver-name=gcc \
-bmingw --export-all -s --def=mysql.def -L/usr/local/lib \
-Le:/usr/local/mingw/lib -o mysql.so mysql.o -L. -lmingw32-ruby16 \
-lmysqlclient -lwsock32 -lz
--> $(LDSHARED) $(DLDFLAGS) -o $(DLLIB) $(OBJS) $(LIBS) $(LOCAL_LIBS))
ですね。find_library で失敗したのは、
gcc -bmingw -o conftest -Ie:/usr/local/mingw/lib/ruby/1.6/i686-mingw32 \
-DNT -D__MSVCRT__ -Os -Ie:/usr/local/mingw/include -I/usr/local/include \
-L/usr/local/lib -L/usr/local/lib/mysql conftest.c -lmysqlclient -lwsock32 \
-lz -lcrypt -lwsock32 -lmsvcrt
Exception `NameError' at e:/usr/local/mingw/lib/ruby/1.6/mkmf.rb:61 - undefined metho
d `to_ary' for #<String:0xd9b300>
/tmp/ccQYahYn.o(.text+0x1b):conftest.c: undefined reference to `mysql_query'
collect2: ld returned 1 exit status
no
-lwsock32 は、extconf.rb のテストでは、have_library("z")でも自動的に
付くのですが、生成された Makefileになかったので、have_library("wsock32")
も明示的に追加しました。
$ rubymg -r./mysql.so -e 'p Mysql.constants.sort'
["ARGF", "ARGV", "ArgumentError", "Array", "Bignum", "Binding",
"CLIENT_CHANGE_USER", "CLIENT_COMPRESS", "CLIENT_FOUND_ROWS",
"CLIENT_IGNORE_SIGPIPE", "CLIENT_IGNORE_SPACE", "CLIENT_INTERACTIVE",
"CLIENT_LOCAL_FILES", "CLIENT_NO_SCHEMA", "CLIENT_ODBC", "CLIENT_SSL",
"CLIENT_TRANSACTIONS", "Class", "Comparable", "Continuation", "Data",
"Dir", "ENV", "EOFError", "Enumerable", "Errno", "Exception", "FALSE",
"FalseClass", "File", "FileTest", "Fixnum", "Float", "FloatDomainError",
"GC", "Hash", "INIT_COMMAND", "IO", "IOError", "IndexError", "Integer",
"Interrupt", "Kernel", "LoadError", "LocalJumpError", "Marshal",
"MatchData", "MatchingData", "Math", "Method", "Module", "Mysql",
"MysqlError", "MysqlField", "MysqlRes", "NIL", "NameError", "NilClass",
"NoMemoryError", "NotImplementError", "NotImplementedError", "Numeric",
"OPT_COMPRESS", "OPT_CONNECT_TIMEOUT", "OPT_NAMED_PIPE", "Object",
"ObjectSpace", "PLATFORM", "Precision","Proc", "Process",
"READ_DEFAULT_FILE", "READ_DEFAULT_GROUP", "REFRESH_GRANT",
"REFRESH_HOSTS", "REFRESH_LOG", "REFRESH_MASTER", "REFRESH_SLAVE",
"REFRESH_STATUS", "REFRESH_TABLES", "REFRESH_THREADS", "RELEASE_DATE",
"RUBY_PLATFORM", "RUBY_RELEASE_DATE","RUBY_VERSION", "Range",
"RangeError", "Regexp", "RegexpError", "RuntimeError", "STDERR",
"STDIN", "STDOUT", "ScriptError", "SecurityError", "SignalException",
"StandardError", "String", "Struct", "Symbol", "SyntaxError",
"SystemCallError", "SystemExit","SystemStackError", "TOPLEVEL_BINDING",
"TRUE", "Thread", "ThreadError", "ThreadGroup", "Time", "TrueClass",
"TypeError", "UnboundMethod", "VERSION", "ZeroDivisionError"]
こんどこそ、ちゃんとバイナリできたかな。
日記はじめました。 http://slashdot.jp/journal.pl?op=display&uid=4115
たむら mailto:sgs02516 / nifty.com