インポートライブラリの作成
1. 静的インポートライブラリを作成する
リンカーの要件を満たすために、mysqldのすべてのオブジェクトを基にしたライブラリファイルを作成する必要があります。必要なオブジェクトのリストを取得するために、私は簡単なバッチスクリプトを作成しました。mysqldのビルド処理の際にcmakeによって作成されるbuild.makeファイルから取得を行います。それには、コンパイル済みオブジェクトとbuild.makeファイルが必要なので、mysqldをコンパイルしていない場合、まずはコンパイルしてください。具体的には、MySQLのソースのルートディレクトリで、次のように入力します。
cmake.exe" . -G "NMake Makefiles"
バッチスクリプトmake_lib.cmdを作業ディレクトリ(win\delayload)に置きます。
このディレクトリでシェルを開き、VC環境をセットアップします(vcvars32.batを実行)。スクリプトを正しく実行するには、パスの通った場所にlib.exeツールが必要だからです。そして、次のようにスクリプトを実行します。
make_lib
これで、すべてのオブジェクトを取り込んだ新しい静的ライブラリmysqld-test-static.libができあがります。
実は、この時点でプラグインを使用することも不可能ではありません。この静的ライブラリファイルには必要な関数がすべて取り込まれているので、これにリンクすれば事足りるからです。しかしそれでは、.dllファイルのサイズがmysqld.exeと同じかそれ以上になってしまい、ナンセンスです。そこで、次の手順でこれをDLLに変換し、リンカー用のインポートライブラリを生成して、遅延読み込みを指定できるようにします。.dllファイルを作成することはできませんが、インポートライブラリを作成すればうまくいくはずであり、それで十分です。
2. 静的ライブラリをDLLに変換する
次は、静的ライブラリをDLLに変換する作業です。これはかなり込み入った作業です。MSVCのデフォルトのツール群では、すべてのシンボルをエクスポートするDLLを自動的に作成するのは不可能です。そこで、再びちょっとしたヘルパースクリプトの力を借りる必要があります。このスクリプトは、Grigore Stefan氏が作成した変換スクリプトを一部借用しています。氏のオリジナルのスクリプトはhttp://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=496762&SiteID=1にあります。
ただし、MySQLのインポートライブラリ作成にあたっては、スクリプトに修正が必要でした。元のスクリプトは非常に速度が遅かったうえ、データエクスポート用に有効な.defファイルが作成されませんでした。マークが行われず、エクスポートされた各シンボルがすべてインポートライブラリ用の関数となっていたのですが、それでは誤りです。
エクスポート用の正しい.defファイルを作成するには、2つのGPLプログラムの力を借りる必要があります。1つはMinGWのdlltool、もう1つはGNUのストリームエディタsedです。dlltoolでは、先に作成した静的ライブラリのすべてのエクスポートを含む有効な.defファイルを作成できます。またsedでは、作成される.defファイルに含まれるいくつかのエラーを修正できます。詳細については、バッチスクリプトを参照してください。このdlltool.exeとsed.exeを、パスの通った場所に置きます。これらのツールをお持ちでない場合は、ダウンロードのうえ、作業ディレクトリに展開しておいてください。Visual Cのビルド環境を既にセットアップ済みのシェルで、次のように実行します。
lib_to_dll mysqld
これにはかなりの時間がかかることがありますが、すべてうまくいった場合には、インポートライブラリmysqld.libができあがります。
