首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swig(Tcl):我可以在执行c++程序时调用Swig函数吗?

Swig(Tcl):我可以在执行c++程序时调用Swig函数吗?
EN

Stack Overflow用户
提问于 2016-04-08 09:43:20
回答 1查看 111关注 0票数 0

我有一个c++程序,它有一个Tcl解释器。我包装我的函数,并将它们手动添加到Tcl解释器中。是否可以通过Swig自动包装并添加它们?

以下是简化的代码:

代码语言:javascript
复制
#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将SystemData导出到Tcl:

代码语言:javascript
复制
// 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界面:

代码语言:javascript
复制
/* swig.i */
 %module swig
 %{
 /* Put header files here or function declarations like below */
class SystemData;
extern SystemData* systemData;
 %}

extern SystemData* systemData;

编译命令:

代码语言:javascript
复制
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的结果是

代码语言:javascript
复制
NULL

我也尝试过不加载swig.so,但是,puts $systemData的结果是

代码语言:javascript
复制
can't read "systemData": no such variable

有人有主意吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-11 09:43:33

问题在于编译命令。我的最后命令是:

代码语言:javascript
复制
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

上述命令的输出如下:

代码语言:javascript
复制
swig.i:22: Warning(454): Setting a pointer/reference variable may leak memory.
_906e600000000000_p_SystemData
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36496413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档