我有一些C-API,将由tcl脚本调用。我使用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具有“ 64位TCL支持”功能。我已经尝试过1.3.38版(32位)和3.0.10版(64位),但是两个版本都发生了相同的崩溃。我是否错过了一些启用64位支持的功能?

顺便说一句,我的tcl是8.5.19(64位),并且代码在32位平台上运行良好。

看起来问题在于SWIG无法正确处理64位c指针。我不熟悉swig。如果有人可以帮助,我将非常感激。

最佳答案

您生成的源没有看到headerGet的声明。

确保您具有正确声明headerGet()的头文件,并在.i文件中放入一个include指令:

%module headerGet
%{
#include "headerGet.h"
%}

关于c - SWIG无法正确处理64位c指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44173485/

10-14 15:44