SWIG无法正确处理64位c指针
我有一些C-API将由tcl脚本调用。我使用SWIG包装C-api。但是当我在64位平台上运行脚本时,tcl进程会崩溃。SWIG似乎未正确处理c指针。详情见下文 这是我的C-API,它非常简单SWIG无法正确处理64位c指针,c,tcl,swig,32bit-64bit,C,Tcl,Swig,32bit 64bit,我有一些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; } 以下是SWIG生成的
MsgHeader_t *
headerGet(void)
{
printf("*********** headerGet in capis_swig.c: %p\n", &currHeader);
return &currHeader;
}
以下是SWIG生成的capis_wrap.c中的相关代码:
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)
据介绍,SWIG-1.3.22具有64位TCL支持功能。我尝试了32位版本1.3.38和64位版本3.0.10,但两个版本的崩溃情况相同。我是否错过了启用64位支持的功能
顺便说一句,我的tcl是8.5.19 64位,代码在32位平台上运行良好
问题似乎在于SWIG无法正确处理64位c指针。我不熟悉swig。如果有人能提供帮助,我将不胜感激。您生成的源代码没有看到headerGet的声明 确保您有一个正确声明headerGet的头文件,并在.i文件中放入include指令:
%module headerGet
%{
#include "headerGet.h"
%}
你能发一封邮件吗?看来你的capis_wrap.c中没有声明headerGet。这是非法的,不起作用。您需要指示SWIG包含一个带有headerGet声明的适当头文件。为了修复编译错误,您永远不应该使用强制转换。很抱歉,我不能发布最小、完整且可验证的示例。这是一个很难满足的要求。你需要想出一种方法让别人重现你的问题。如果你正在做的项目太大,创建一个完全独立的小项目,并在那里重现你的问题。谢谢你的回复。很抱歉,我无法发布最小、完整且可验证的示例。这些代码片段来自一个大型项目。很难把他们分开。实际上headerGet是在capis_swig.h中声明的,它是生成capis_wrap.c时的一个输入,在Makefile中,我有这样一个:capis_wrap.c:capis_swig.h swig-includeal-ignoremissing-warn=0-w201302305-tcl8-o capis_wrap.c如果不能重现您的问题,就不可能取得进展。想办法,谢谢你。添加include后,它可以正常工作。再次感谢。