【发布时间】:2017-10-25 16:33:01
【问题描述】:
我有一些将被 tcl 脚本调用的 C-API。我使用 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不熟悉。如果有人能提供帮助,我将不胜感激。
【问题讨论】:
-
你能发一个minimal reproducible example吗?
-
看起来
headerGet()没有在您的 capis_wrap.c 中声明。这是非法的,并且不起作用。您需要指示 SWIG 包含一个声明为headerGet()的适当头文件。您也不应该使用强制转换来“修复”编译错误。 -
抱歉,我不能发布“最小、完整和可验证的示例” 这是一个硬性要求。您需要想出一种方法让其他人重现您的问题。如果您正在处理的项目太大,请创建一个完全独立的小项目并在那里重现您的问题。
-
感谢您的回复。抱歉,我不能发布“最小、完整和可验证的示例”。代码 sn-ps 来自一个大型项目。很难将它们分开。实际上 headerGet() 是在 capis_swig.h 中声明的,它是生成 capis_wrap.c 时的输入,在 Makefile 中,我有这个: capis_wrap.c: capis_swig.h swig -includeall -ignoremissing -warn=0 -w201,302,305 -tcl8 - o capis_wrap.c
-
如果不能重现您的问题,就不可能取得进展。想办法。
标签: c tcl swig 32bit-64bit