2016-04-08 16 views
0

私はTclインタープリタを持つC++プログラムを持っています。 私の関数をラップし、Tclインタプリタに手動で追加します。 Swigで自動的にラップして追加することはできますか?ここでSwig(Tcl):C++プログラムの実行中にSwig関数を呼び出せますか?

は単純化されたコードです:

#include <stdio.h> 
#include <tcl.h> 

class SystemData {    // I have a class which link to all the data and function 
public: 
    void print(){ 
     printf("Hello!\n"); 
    }; 
}; 
           // I wrap the functions manually. But I'm tired to maintain them. 
int Hello(ClientData clientData, Tcl_Interp *interp, int argc, const char **argv) { 
    SystemData* system = (SystemData*) clientData; 
    system->print(); 
} 

int main (int argc, char *argv[]) { 
    Tcl_Interp *interp = Tcl_CreateInterp();; 
    SystemData* system = new SystemData; 
    Tcl_CreateCommand(interp, "hello", Hello, (ClientData)system, (Tcl_CmdDeleteProc *)NULL); 

    Tcl_Eval(interp, "hello"); // I have a Tcl interpreter so that I can call any function in any time 

    Tcl_DeleteInterp(interp); 
} 

私はガブガブ飲むことでのTclにSystemDataを輸出しようとしている:

// swig.cc 
#include <stdio.h> 
#include <tcl.h> 

class SystemData { 
public: 
    void print(){ 
     printf("Hello!\n"); 
    }; 
}; 

SystemData* systemData; 
int main (int argc, char *argv[]) { 
    Tcl_Interp *interp = Tcl_CreateInterp();; 
    systemData = new SystemData; 


    Tcl_Eval(interp, "load ./swig.so swig"); 
    Tcl_Eval(interp, "puts $systemData"); 

    Tcl_DeleteInterp(interp); 
} 

マイガブガブ飲むインタフェース:

/* swig.i */ 
%module swig 
%{ 
/* Put header files here or function declarations like below */ 
class SystemData; 
extern SystemData* systemData; 
%} 

extern SystemData* systemData; 

コンパイルコマンド:

swig -tcl swig.i 
g++ -fpic -c swig.cc swig_wrap.c -I/usr/local/include 
g++ -shared swig.o swig_wrap.o -o swig.so 

しかし、puts $systemDataの結果は、私はまた、しかしswig.so をロードしない試みた

NULL 

で、puts $systemDataの結果は

can't read "systemData": no such variable 

誰もがアイデアを持っているのですか?

答えて

0

問題はコンパイルコマンドにあります。私の最終的コマンドは次のとおりです。

swig -c++ -tcl swig.i 
g++ -fpic -c swig.cc swig_wrap.cxx 
g++ -shared swig.o swig_wrap.o -o swig.so 
g++ swig.o swig_wrap.o -o swig.out -g -I/usr/local/include -L/usr/local/lib -ltcl8.5 
setenv LD_LIBRARY_PATH /usr/local/lib:/usr/local/lib 
./swig.out 

そして、上記のコマンドの出力は以下のとおりです。?

swig.i:22: Warning(454): Setting a pointer/reference variable may leak memory. 
_906e600000000000_p_SystemData 
+0

シナリオのこのタイプのための任意の勧告、データの漏洩なし? –

+0

@VenkataVamshi: 私はまだプロジェクトをダウンさせていません。しかし、私はあなたがC++をコーディングするときと同じだと思います。 たとえば、systemDataに直接アクセスする代わりにgetSystemData()およびsetSystemData()を使用します。 したがって、setSystemData()のメモリーを保護できます。 'void setSystemData(SystemData * data){ /*古い古いデータ* /; systemData = data; } ' – peizon

関連する問題