TCL脚本无法保留从C-API返回的64位指针

问题描述:

我有一个旧的TCL脚本,它在32位机器上运行良好,但在64位机器上出现“分段错误”。脚本如下:TCL脚本无法保留从C-API返回的64位指针

... 
set msgHeader [ headerGet ] 
setAnswerMessageHeader $cmd 0x00 $msgHeader 
... 

这里headerGet和setAnswerMessageHeader是C-的API,其是这样的:

static MsgHeader_t currHeader; 

MsgHeader_t * 
headerGet(void) 
{ 
    printf("***********  headerGet: %p\n", &currHeader); 
    return &currHeader; 
} 

int 
setAnswerMessageHeader(Msg_t * cmd, W8 cmdFlags, MsgHeader_t * hdr) 
{ 
    printf("***********  setAnswerMessageHeader, cmd=%p, cmdFlags=%d, hdr=%p\n", cmd, cmdFlags, hdr); 

    ... 

    return RETURN_OK; 
} 

这里是64位机器上我的调试输出:

***********  headerGet: 0x7f86ab50edb0 
***********  setAnswerMessageHeader, cmd=0x337c950, cmdFlags=0, hdr=0xffffffffab50edb0 

所以,问题是:headerGet返回地址0x7f86 ab50edb0到msgHeader变体,但是当TCL将它传递给setAnswerMessageHeader时,地址是完全错误的。看起来只保留了该地位的最后四个字节(0x ab50edb0)。 前两个(0x7f86)丢失

BTW:我的TCL版本是8.5

我unfamliar与TCL/TK。有没有人知道为什么发生这种情况,以及如何解决它?

+0

你在使用C++代码和你的Tcl代码之间的绑定层是什么?我问,因为这是错误的地方... –

+1

这是SWIG。我检查了我的env,发现它是32位的。所以也许是原因。我会更新它并再次运行。感谢你的“问”,这实际上给了我一个方向。 –

问题在于你正在使用的SWIG的构建,因为它将指针视为一个32位值(它抛弃了那些重要的位)。您需要SWIG了解它必须生成64位感知代码,以便指针正确映射。

+0

感谢您的回复。任何想法如何让SWIG生成64位感知代码? –