wxSQLite3を使う
SQLiteはAndroidの標準DB(?)にも採用されている優れたリレーショナルデータベースです。
wxWidgetsで使おうと思っていたので、wxSQLite3をビルドして組み込んでみた。
まずぶち当たるのはバージョンの問題。SQLite自体が結構な速さで更新されているのでちゃんとwxSQLite3とのバージョンを合わせないとビルドできない。
今回はwxsqlite3-2.1.3とsqlite-autoconf-3070900を使ってビルドした。
ビルドの注意点としてはwxSQLite3はwxのライブラリを必要とするということ。makeの途中で止まったら「make LDFLAGS='-lhogehogelibrary'」みたいな感じでガガっと読み込ませてください。
mingwの場合「/c/mingw/lib」以下に「libwxcode_mswu_wxsqlite3-2.9.a」とか「libsqlite3.a」があれば成功じゃないかなと。
そしてお手本アプリの劣化版を作ってビルドしてみる。
Main.cpp
/* * Main.cpp * * Created on: 2012/01/17 * Author: learning */ #include <wx/wxprec.h> #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include <wx/wx.h> #endif #include "WxSQLiteMinimal.h" class wxMain: public wxApp { public: bool OnInit(); }; IMPLEMENT_APP(wxMain) bool wxMain::OnInit() { WxSQLiteMinimal* wxSQLiteMinimal = new WxSQLiteMinimal(); return true; }
WxSQLiteMinimal.cpp
/* * WxSQLiteMinimal.cpp * * Created on: 2012/01/17 * Author: learning */ #include "WxSQLiteMinimal.h" bool WxSQLiteMinimal::OnInit() { return true; } int WxSQLiteMinimal::OnExit() { return 0; } int WxSQLiteMinimal::OnRun() { const wxString dbFile = wxGetCwd() + wxT("/test.db"); try { // データベースの初期化 wxSQLite3Database::InitializeSQLite(); wxSQLite3Database db; cout << "SQLite3 Version: " << (const char*) db.GetVersion().mb_str(wxConvUTF8) << endl; cout << "SQLite3 Source Id: " << (const char*) db.GetSourceId().mb_str(wxConvUTF8) << endl; // DBを開く db.Open(dbFile); } catch (wxSQLite3Exception& e) { cerr << e.GetErrorCode() << ":" << (const char*) (e.GetMessage().mb_str()) << endl; } return 0; }
WxSQLiteMinimal.h
/* * WxSQLiteMinimal.h * * Created on: 2012/01/17 * Author: learning */ #ifndef WXSQLITEMINIMAL_H_ #define WXSQLITEMINIMAL_H_ #include <wx/wxprec.h> #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include <wx/wx.h> #endif #include "wx/wxsqlite3.h" #include <ctime> #include <iostream> using namespace std; class WxSQLiteMinimal: public wxAppConsole { public: bool OnInit(); int OnRun(); int OnExit(); private: }; #endif /* WXSQLITEMINIMAL_H_ */
# Makefile TARGET = WxSQLiteMinimal.exe OBJECTS = WxSQLiteMinimal.o Main.o # 基本コマンド RM := rm CXX := g++ CC := g++ WINDRES := windres # デバッグ時とリリース時の微調整 CXX_DEBUG_FLAGS = -g -O0 CXX_RELEASE_FLAGS = -s -O0 # 基本オプション CPPFLAGS = -Wall -I/c/MinGW/include -I/mingw/include/wx -I include `wx-config --cxxflags` LDFLAGS = -L/c/MinGW/lib -static -lwxcode_mswu_wxsqlite3-2.9 -lsqlite3 `wx-config --libs` VPATH = include src # make # debug .PHONY : Debug Debug : CXXFLAGS+=$(CXX_DEBUG_FLAGS) Debug : all # release .PHONY : Release Release : CXXFLAGS+=$(CXX_RELEASE_FLAGS) Release : all all : $(TARGET) $(TARGET) : $(OBJECTS) $(CXX) $^ -o $@ $(LDFLAGS) WxSQLiteMinimal.o : WxSQLiteMinimal.cpp WxSQLiteMinimal.h $(CXX) -c $< $(CPPFLAGS) Main.o : Main.cpp WxSQLiteMinimal.h $(CXX) -c $< $(CPPFLAGS) # make clean .PHONY: clean clean: rm -f *.o $(TARGET)
ライブラリの読み込み順は今回ちょっと重要で、「-L/c/MinGW/lib -static -lwxcode_mswu_wxsqlite3-2.9 -lsqlite3 `wx-config --libs`」
wx-config --libsを後に読み込ませないとundefined referenceが出た。多分wxsqliteの内部でwxregexを呼んでるからじゃないかなあと推測。