MinGW 環境で、スクリプト言語 Lua のビジュアルデバッガである lldebug がコンパイルできない。

2 Comments

  1. fumiu says:

    wxWidget と Boost(バージョン1.41.0以降が必要)は準備済みとする。

    まずは extralib/treelistctrl をコンパイルするために、extralib/treelistctrl/src/treelistctrl.cpp に以下の4行目のようにインクルードを追加する。

    #include <wx/dcscreen.h>
    #include <wx/scrolwin.h>
    
    #include <wx/dcmemory.h>
    
    #include "wx/treelistctrl.h"
    

    続いて、.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 にも以下のインクルードを追加する。

    #include <iostream>
    

    さらに src/visual/sourceview.cpp の465行目(下の2行目)に以下のように「.data()」を追加する。

                  wxCharBuffer cbuffer = GetLineRaw(i);
                  std::string buffer = (cbuffer.data() != NULL ? cbuffer.data() : "");
    
                  // trim newlines
    

    これで make できるようになるはず…と思いきや、まだ通らない。
    この続きは次回ということで。

  2. fumiu says:

    上の状態で make すると、途中からコマンドの先頭に「X」が入ってエラーしているのが分かった。
    どうやら最後のリンクでコケているようなので、その部分だけ抽出してみると次のようになった。
    「/usr/local/lib/libboost-*」の部分や、「”/c/Program Files/*”」の部分は各自の環境に合わせること。

    build.sh

    #!/bin/sh
    
    g++ -g -O2 -o lldebug_frame.exe lldebug_frame-*.o \
    ../treelistctrl/libtreelistctrl.a \
    ../wxscintilla/libwxscintilla.a \
    /usr/local/lib/libboost_thread-mgw34-mt-1_42.lib \
    /usr/local/lib/libboost_filesystem-mgw34-mt-1_42.lib \
    /usr/local/lib/libboost_system-mgw34-mt-1_42.lib \
    /usr/local/lib/libboost_serialization-mgw34-mt-1_42.lib \
    "/c/Program Files/Microsoft Platform SDK/Lib/ws2_32.lib" \
    "/c/Program Files/Microsoft Platform SDK/Lib/mswsock.lib" \
    `wx-config --libs`
    

    これを使ってリンクすると、「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行目だ。

    CC = gcc
    CCDEPMODE = depmode=gcc3
    CFLAGS = -pipe -O2 -mms-bitfields -march=i686 -DUNICODE
    CPP = gcc -E
    CPPFLAGS = -DUNICODE
    CXX = g++
    CXXCPP = g++ -E
    CXXDEPMODE = depmode=gcc3
    CXXFLAGS = -g -O2 -DUNICODE
    CYGPATH_W = echo
    DEFS = -DHAVE_CONFIG_H
    

    これでまた 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行目だ。

    修正前

    top_builddir = ../..
    top_srcdir = ../..
    INCLUDES = -I../../include `lua-config --include`
    LUA_LIBS = `lua-config --libs`
    lua_debug_SOURCES = ../../src/lua_debug/lua_debug.c
    

    修正後

    top_builddir = ../..
    top_srcdir = ../..
    INCLUDES = -I../../include -I/usr/local/include/lua
    LUA_LIBS = -L/usr/local/lib -llua
    lua_debug_SOURCES = ../../src/lua_debug/lua_debug.c
    

    ここで「make」すると、また libtool まわりでエラーになるかもしれない。その時は以下の build.sh を作って、実行するとよい。

    #!/bin/sh
    
    g++ -g -O2 -o lua_debug.exe lua_debug-*.o \
    -L/usr/local/lib \
    ../lldebug/liblldebug.a \
    /usr/local/lib/libboost_system-mgw34-mt-1_42.lib \
    /usr/local/lib/libboost_thread-mgw34-mt-1_42.lib \
    /usr/local/lib/libboost_filesystem-mgw34-mt-1_42.lib \
    /usr/local/lib/libboost_serialization-mgw34-mt-1_42.lib \
    "/c/Program Files/Microsoft Platform SDK/Lib/ws2_32.lib" \
    "/c/Program Files/Microsoft Platform SDK/Lib/mswsock.lib" \
    -llua
    

    これで前と同様に「/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 にファイル名を与えて起動すると、デバッグウィンドウが表示されることで行える。

    -- test.lua
    
    function hello()
      print "hello"
    end
    
    hello()
    

    実際のプログラムは include 以下のヘッダファイル二つを /usr/local/include あたりへコピーしておき、lua.h の代わりに lldebug.h をインクルードして通常通り使えばいい模様。詳しくはサイトか lua_debug のソースを参照のこと。

    以上である。

Leave a Reply