2016-04-08 20 views
0

Tcl tercümanına sahip bir C++ programım var. İşlevlerimi kaydırıyorum ve bunları manuel olarak Tcl yorumlayıcısına ekliyorum. Swig tarafından otomatik olarak sarmak ve eklemek mümkün mü? Ben Swig tarafından Tcl için SystemData ihraç etmeye çalıştıkSwig (Tcl): C++ programımı yürütürken Swig işlevini çağırabilir miyim?

#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); 
} 

:

// 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); 
} 

Benim Swig arayüzü:

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

extern SystemData* systemData; 

derleme komutları İşte

basitleştirilmiş kodudur:

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 

Ancak puts $systemData sonucu ben de Bununla swig.so yüklenmeyen çalıştı

NULL 

olduğunu puts $systemData sonucu

can't read "systemData": no such variable 

Herkes bir fikir var mı?

cevap

0

Sorun derleme komutlarındandır. komutlarıdır nihayet listem:

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 

Ve yukarıdaki komutların çıktısı şunlardır: senaryolardan bu tip

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

Herhangi öneri, verilerin herhangi bir sızıntı olmadan? –

+0

@VenkataVamshi: Henüz projem bitmedi. Ama ben C++ kodunu kullandığınızda aynı olduğunu düşünüyorum. Örneğin, doğrudan systemData'ya erişmek yerine getSystemData() ve setSystemData() kullanın. Böylece, setSystemData() içindeki belleği koruyabilirsiniz. 'void setSystemData (SystemData * verileri) { /* boş eski veriler * /; systemData = data; } ' – peizon

İlgili konular