SWIG无法正确处理64位c指针

时间:2017-05-25 06:11:05

标签: c tcl swig 32bit-64bit

我有一些将由tcl脚本调用的C-API。我使用SWIG来包装C-API。但是当我在64位平台上运行脚本时,tcl进程崩溃了。看起来SWIG没有正确处理c指针。请参阅下面的详细信息。

这是我的C-API,非常简单。

MsgHeader_t *
headerGet(void)
{
    printf("***********     headerGet in capis_swig.c: %p\n", &currHeader);
    return &currHeader;
}

以下是capis_wrap.c中的相关代码(由SWIG生成):

SWIGINTERN int
_wrap_headerGet(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, 
int objc, Tcl_Obj *CONST objv[]) {
  MsgHeader_t *result = 0 ;

  if (SWIG_GetArgs(interp, objc, objv,":headerGet ") == TCL_ERROR) SWIG_fail;
  printf("***********     begin to call C-API headerGet\n");
  result = (MsgHeader_t *)headerGet();
  printf("***********     headerGet in capis_wrap.c: %p\n", result);
  Tcl_SetObjResult(interp, 
      SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_MsgHeader_t ,0));
  return TCL_OK;
fail:
  return TCL_ERROR;
}

这是控制台中的输出:

*********** Line 268: 0 : msgHeader 
***********     begin to call C-API headerGet
***********     headerGet in capis_swig.c: 0x7f8bfc507290
***********     headerGet in capis_wrap.c: 0xfffffffffc507290
...
Segmentation fault (core dumped)

根据http://www.swig.org/Release/RELEASENOTES,SWIG-1.3.22具有#34; 64位TCL支持功能"。我尝试过版本1.3.38(32位)和3.0.10(64位),但两个版本都遭遇了同样的崩溃。我是否遗漏了启用64位支持的内容?

BTW,我的tcl是8.5.19(64位),代码在32位平台上运行良好。

看起来问题是SWIG无法正确处理64位c指针。我不熟悉swig。如果有人能提供帮助,我非常感激。

1 个答案:

答案 0 :(得分:1)

您生成的来源没有看到str1 <- c("DT-9045-BIN1-C-A1", "DT-GT200-BIN5-E-A2") 的声明。

确保您有一个头文件,其中properties([ parameters([ string(defaultValue: 'regularPipeline', description: 'A parameter to run the health monitoring', name: 'Health') ]), pipelineTriggers([ [ $class: 'hudson.triggers.TimerTrigger', spec: "H/10 * * * *" ] ]) ]) 被正确声明,并在.i文件中放入一个include指令:

headerGet