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"
%}
我有一些 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"
%}