我有一些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/