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ı?
Herhangi öneri, verilerin herhangi bir sızıntı olmadan? –
@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