我对tcl很新。
我正在尝试使用load命令加载一个dll但是我得到一个未定义的符号错误。
我很确定该消息暗示dll是针对特定(专有)解释器的。
如果我尝试从“wish”执行加载,我会收到错误,但如果我从专有解释器执行加载,则会加载错误。
我在load命令中看到我可以传入packageName和interp。 我想如果我传入专有的解释器,我也许可以让它工作,但如果我传入解释器的路径,我会收到一条错误消息,说它无法解释翻译器。 有谁知道interp =期待什么?
顺便说一下,我不能只使用专有的解释器,因为我真的只是试图从ruby调用tcl命令,而且我没有用该解释器编译ruby的头文件。命令,我收到一条错误消息,说明有未定义的符号。
答案 0 :(得分:2)
load
命令执行两项操作:
它找到指定的共享库并使其在进程中“存在”。 (用于此的OS API各不相同;在Unix上通常为dlopen()
,在Windows上为LoadLibraryEx()
。)
然后它在库中定位初始化函数并调用它,将句柄传递给解释器,以获取库中的功能。初始化函数的名称通常来自库的名称;如果您正在加载foobar72.dll
,则该函数将被称为Foobar_Init
。 Tcl总是假设初始化函数的类型签名是这样的:
int InitFunc(Tcl_Interp *interp);
我猜第一阶段有效,但第二阶段失败;没有初始化函数,并且该库不适用于Tcl。 (特别是,它也不知道如何使用Tcl的API来注册命令,设置变量等。)
解决这个问题的方法是: