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

SWIG cannot handle 64-bit c-pointer correctly

我有一些 C-APIs 将被 tcl 脚本调用。我使用 SWIG 来包装 C-APIs。但是当我 运行 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 指针。我对痛饮不熟悉。如果有人能提供帮助,我将不胜感激。

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

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

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