我有一些将由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具有#34; 64位TCL支持功能"。我尝试过版本1.3.38(32位)和3.0.10(64位),但两个版本都遭遇了同样的崩溃。我是否遗漏了启用64位支持的内容?
BTW,我的tcl是8.5.19(64位),代码在32位平台上运行良好。
看起来问题是SWIG无法正确处理64位c指针。我不熟悉swig。如果有人能提供帮助,我非常感激。
答案 0 :(得分:1)
您生成的来源没有看到str1 <- c("DT-9045-BIN1-C-A1", "DT-GT200-BIN5-E-A2")
的声明。
确保您有一个头文件,其中properties([
parameters([
string(defaultValue: 'regularPipeline', description: 'A parameter to run the health monitoring', name: 'Health')
]),
pipelineTriggers([
[
$class: 'hudson.triggers.TimerTrigger',
spec: "H/10 * * * *"
]
])
])
被正确声明,并在.i文件中放入一个include指令:
headerGet