« MS-IME+AZIKだと途端にバカになるIME君 | トップページ | NSIS »

SQLite3 Ver.3.6.4

SQLiteを業務で使おうとしてるんだが、VB6がまだまだ現役なので、ネットを探してhttp://www.persistentrealities.com/index.php?p=18なるところを見つけた。VB6.0用のラッパーを含んだDLLをこれで作れる。VB6のテストサンプルもあり、動作完了。めでたしめでたし、となったはずが…。

SQLiteのホームページを見ると、Ver.3.6.4がアップされている。動作確認時は、3.5.9だったので、さっそくダウロードしてやってみることに。どうやら、3.6.xでいろいろとファイルが増えているようである。それらをプロジェクトに放り込んで、VB用にいろいろとソースを修正して、いざコンパイルしてみると、リンクでエラーが出てDLLができない。エラーは、

エラー 1 error LNK2005: _sqlite3_api は既に fts3_tokenizer.obj で定義されています。 fts3.obj SQLite3VB
エラー 2 error LNK2005: _sqlite3_api は既に fts3_tokenizer.obj で定義されています。 rtree.obj SQLite3VB
エラー 3 error LNK2005: _sqlite3_extension_init は既に fts3.obj で定義されています。 rtree.obj SQLite3VB

である。

fts3は3.5.9ではこんな問題なかったなぁ。と、いろいろ調べると、SQLITE_ENABLE_FTS3のプリプロセッサ定義が必要みたいなので(3.5.9では設定してなくても問題なかったのに…)、それと、新しく追加されたrtree.cでも同じだろうということで、SQLITE_ENABLE_RTREEを設定してやってみることに。

え~、まだ、「fts3_tokenizer.obj」で二重定義が出やがる。

仕方ないのでソースを眺めてみると、どうもSQLITE_EXTENSION_INIT1というマクロの使い方がまずそうなことに気がついた。ここで、インターネットを漁っていると、中国語のOKWave見たいなところに、fts3_tokenizerのSQLITE_EXTENSION_INIT1を直接externを付けて展開すれば問題がなくなるとあったので、やっぱりそういうことかということで、無事コンパイル完了。テスト動作もOK。めでたしめでたし。

こんなやり方でいいのかと一抹の不安もなくはない。

なんで、こんなソースになってるんだろうか? SQLiteには全ソースを1つのソースにまとめたamalgamationというのがある。これを見てもSQLITE_EXTENSION_INIT1が2回以上定義されてしまうはず。う~む、処理系の違いかなぁ。少なくとも、VS2008ではLNK2005でリンクが通らないのは確かである。

|

« MS-IME+AZIKだと途端にバカになるIME君 | トップページ | NSIS »

パソコン・インターネット」カテゴリの記事