MinGW 環境で、スクリプト言語 Lua のビジュアルデバッガである lldebug がコンパイルできない。
This entry was posted by fumiu on 2010年3月5日 at 3:53 PM under プログラミング言語. Tagged Lua, MinGW, スクリプト.
You can leave a response, or trackback from your own site. Follow any responses to this entry through the RSS 2.0 feed.
fumiu says:
wxWidget と Boost(バージョン1.41.0以降が必要)は準備済みとする。
まずは extralib/treelistctrl をコンパイルするために、extralib/treelistctrl/src/treelistctrl.cpp に以下の4行目のようにインクルードを追加する。
続いて、.configure の後に出来上がる build/lldebug/Makefile を以下のように修正する。
修正前
INCLUDES = -I../../include \ -I../../src \ -I../../extralib/boost_asio_0_3_9 \ `lua-config --include`修正後(Luaのヘッダファイルが/usr/local/include/luaにある場合)
INCLUDES = -I../../include \ -I../../src \ -I../../extralib/boost_asio_0_3_9 \ -I/usr/local/include/luaその後、src/net/echostream.h の139行目(以下の2行目)を次のように変更する。
修正前
virtual std::streampos seekoff(std::streamoff /*off*/, std::ios::seek_dir /*dir*/, int mode = std::ios::in | std::ios::out) {修正後
virtual std::streampos seekoff(std::streamoff /*off*/, std::ios::seekdir /*dir*/, int mode = std::ios::in | std::ios::out) {同様に src/net/remoteengine.cpp にも以下のインクルードを追加する。
さらに src/visual/sourceview.cpp の465行目(下の2行目)に以下のように「.data()」を追加する。
wxCharBuffer cbuffer = GetLineRaw(i); std::string buffer = (cbuffer.data() != NULL ? cbuffer.data() : ""); // trim newlinesこれで make できるようになるはず…と思いきや、まだ通らない。
2010年3月5日, 7:33 PMこの続きは次回ということで。
fumiu says:
上の状態で make すると、途中からコマンドの先頭に「X」が入ってエラーしているのが分かった。
どうやら最後のリンクでコケているようなので、その部分だけ抽出してみると次のようになった。
「/usr/local/lib/libboost-*」の部分や、「”/c/Program Files/*”」の部分は各自の環境に合わせること。
build.sh
これを使ってリンクすると、「undefined reference」エラーが発生してしまう。
どうも「wxTextCtrlBase::overflow(int)」あたりで問題になっているらしい。
これをキーワードに色々検索したが、ちょうどヒットするものは無かった。
探しているうちに以下のURLに辿り着き、MinGW での wxWidget のコンパイルオプションが載っていたので、それを試してみることにした。
http://max.berger.name/howto/wxWidgets/wxWidgets_MinGW.jsp
使ったコマンドは「./configure –enable-optimise –enable-stl –enable-unicode –disable-threads –enable-static –disable-shared –enable-monolithic」の後に通常通り「make」だ。
この状態で lldebug_frame の続きをコンパイルしようとしたら「const TCHAR」が「const WCHAR」と違うと怒られた。
仕方無いので build/lldebug_frame/Makefile 中に以下のように「-DUNICODE」を定義する。3行目、5行目、9行目だ。
これでまた libtool あたりで X… というコマンドのエラーで止まる状態になる。このコメントの最初と同様である。
ここで build/lldebug_frame の中で「/bin/sh build.sh」を実行すると、今度は「wxTextCtrlBase」に関する問題が消えているはずだ。
もし自前のboostライブラリがコンパイル済みで、このあたりで「boost_system」関連のエラーが出るようであれば、下のように変更してから「make clean;make」でエラー後に「/bin/sh build.sh」をしてみると直るかもしれない。変更は3行目と13行目だ。
修正前
INCLUDES = -I../../include \ -I../../src \ -I../../extralib/boost_asio_0_3_9 \ -I../../extralib/treelistctrl/include \ -I../../extralib/wxscintilla/include lldebug_frame_CPPFLAGS = -DLLDEBUG_VISUAL \ -Wall $(WXCPPFLAGS) lldebug_frame_LDADD = $(libadd) \ ../treelistctrl/libtreelistctrl.a \ ../wxscintilla/libwxscintilla.a \ ../boost_system/libboost_system.a \ -lboost_thread-mt \ -lboost_filesystem-mt \ -lboost_serialization-mt \ $(WXLIBS)修正後
INCLUDES = -I../../include \ -I../../src \ -I/usr/local/include/boost/asio \ -I../../extralib/treelistctrl/include \ -I../../extralib/wxscintilla/include lldebug_frame_CPPFLAGS = -DLLDEBUG_VISUAL \ -Wall $(WXCPPFLAGS) lldebug_frame_LDADD = $(libadd) \ ../treelistctrl/libtreelistctrl.a \ ../wxscintilla/libwxscintilla.a \ -lboost_system-mt \ -lboost_thread-mt \ -lboost_filesystem-mt \ -lboost_serialization-mt \ $(WXLIBS)これで lldebug_frame.exe が出来ていればOKである。
続いて build/lua_debug/Makefile を次のように修正する。lldebug の時と同様の手順である。修正は3行目および4行目だ。
修正前
修正後
ここで「make」すると、また libtool まわりでエラーになるかもしれない。その時は以下の build.sh を作って、実行するとよい。
これで前と同様に「/bin/sh build.sh」するとリンクできるはずである。
この時に「boost::system::get_posix_category()」などについてエラーが出ていたら、仕方無いので build/lldebug/ に戻って Makefile を編集し、もう一度「make clean;make」しなければならない。
修正前 build/lldebug/Makefile
top_srcdir = ../.. INCLUDES = -I../../include \ -I../../src \ -I../../extralib/boost_asio_0_3_9 \ -I/usr/local/include/lua noinst_LIBRARIES = liblldebug.a修正後 build/lldebug/Makefile (4行目)
top_srcdir = ../.. INCLUDES = -I../../include \ -I../../src \ -I/usr/local/include/boost/asio \ -I/usr/local/include/lua noinst_LIBRARIES = liblldebug.aたぶん、これで lua_debug.exe が出来るはずである。
ここまで出来れば、あとは build/lldebug/liblldebug.a を /usr/local/lib/ にコピーし、build/lldebug_frame/lldebug_frame.exe を /usr/local/bin/ にコピーしておけばよい。
テストは以下のようなファイルを作って、build/lua_debug/lua_debug.exe にファイル名を与えて起動すると、デバッグウィンドウが表示されることで行える。
実際のプログラムは include 以下のヘッダファイル二つを /usr/local/include あたりへコピーしておき、lua.h の代わりに lldebug.h をインクルードして通常通り使えばいい模様。詳しくはサイトか lua_debug のソースを参照のこと。
以上である。
2010年3月9日, 3:17 PM