Windows環境のRedmineにて、RedmineのユーザとSubversionのユーザを同期して使用したい(4)

先週の日記(id:sikakura:20101126)からの続きで、いよいよmod_authn_mysqlのソースをビルドしてみたいと思います。
mod_authn_mysqlソースコード(http://www.gknw.net/development/apache/httpd-2.2/win32/modules/mod_authn_mysql-2.2.3-w32.zip)
をダウンロードしてきました。


ビルド環境ですが、前回と同様に、

が入っていることが前提です。

また、前回までで用意してきた環境にある成果物

  • Apacheのソースビルドから生成されたヘッダーファイルや静的ライブラリ(複数)
  • MySQLのソースビルドから生成された静的ライブラリ(mysqlclient.lib)

も必要になります。

ダウンロードしてきたファイルを解凍すると、以下のような感じになっています。

mod_authn_mysql.dspがVC6++のプロジェクトなのですが、VisualStudio2005の環境でもダブルクリックで開くことが可能です。

のようなポップアップダイアログが表示されますが、「はい」で先に進みます。

ここから変更する箇所が多いです。以下に箇条書きにします。

  • アクティブな構成をDebugからReleaseにします(これはどちらでも良いのですが^^;)
  • プロジェクトの構成プロパティを以下のように変更
    • C/C++>追加のインクルードディレクトリを現行環境のPATHに合わせる
    • C/C++>追加のインクルードディレクトリにMySQLのヘッダファイルの場所を追加する(例 C:\mysql-5.0.83\include)
    • リンカ>追加の依存ファイルを現行環境のPATHに合わせる
    • リンカ>詳細>ベースアドレスを現行環境のPATHに合わせる
  • ビルドを実行する
  • 結果を確認する


問題なければ、エラーなくビルドが終了します。

私場合、初回以下のような「外部シンボル XXX は未解決です。」のエラーがたくさん出ました。


1>------ ビルド開始: プロジェクト: mod_authn_mysql, 構成: Release Win32 ------
1>リンクしています...
1>C:\\httpd-2.2.17\os\win32\BaseAddr.ref : warning LNK4198: 基本キー 'mod_authn_mysql' が見つかりません。既定を適用します。
1> ライブラリ .\Release/mod_authn_mysql.lib とオブジェクト .\Release/mod_authn_mysql.exp を作成中
1>mysqlclient.lib(md2.obj) : error LNK2001: 外部シンボル "_memset" は未解決です。
1>mysqlclient.lib(ctype-czech.obj) : error LNK2001: 外部シンボル "_memset" は未解決です。
1>mysqlclient.lib(ctype-win1250ch.obj) : error LNK2001: 外部シンボル "_memset" は未解決です。
1>mysqlclient.lib(ctype-big5.obj) : error LNK2001: 外部シンボル "_memset" は未解決です。
1>mysqlclient.lib(deflate.obj) : error LNK2001: 外部シンボル "_memset" は未解決です。
1>mysqlclient.lib(xml.obj) : error LNK2001: 外部シンボル "_memset" は未解決です。

〜中略〜

1>OLDNAMES.lib(read.obi) : error LNK2001: 外部シンボル "__imp___read" は未解決です。
1>OLDNAMES.lib(fileno.obi) : error LNK2001: 外部シンボル "__imp___fileno" は未解決です。
1>OLDNAMES.lib(fdopen.obi) : error LNK2001: 外部シンボル "__imp___fdopen" は未解決です。
1>OLDNAMES.lib(getcwd.obi) : error LNK2001: 外部シンボル "__imp___getcwd" は未解決です。
1>OLDNAMES.lib(chdir.obi) : error LNK2001: 外部シンボル "__imp___chdir" は未解決です。
1>LINK : error LNK2001: 外部シンボル "__load_config_used" は未解決です。
1>Release/mod_authn_mysql.so : fatal error LNK1120: 外部参照 106 が未解決です。
1>ビルドログは "file://c:\batconfig\mod_authn_mysql\Release\BuildLog.htm" に保存されました。
1>mod_authn_mysql - エラー 459、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

私の環境の場合、原因はmysqlclient.libを作成したプロジェクトの
プロジェクト構成>C/C++>コード生成>ランタイムライブラリがマルチスレッド DLL (/MD)でした。
このような設定でビルドしたmysqlclient.libを使用すると、出来上がるmod_authn_mysql.soが
Visual Studio 2005のランタイムライブラリ依存(MSVCR80.DLL)になってしまいます。
DependencyWalkerで見ると以下のようになっています。
(LIBHTTPD.DLLとLIBAPR-1.DLL、LIBAPRUTIL-1.DLLはApache系のDLLなのでOKとしました)

↑よろしくないモジュールの依存関係

↑おそらくOKのモジュールの依存関係


出来上がったmod_authn_mysql.soをApacheに組み込んで再起動してみましょう。
問題がなければうまく起動してくれるはずです。私の環境ではめでたく起動しました。
あがらない場合は依存関係にあるDLLを調べてみることをお勧めします。


さて、ようやくApacheMySQL、mod_authn_mysqlすべてビルドできるところまでたどり着きました。
最後は、mod_authn_mysqlsha1を組み込んで動作を確認したいと思います。