如何 link 到 Tcl C 中的 tclOO 函数 API

how to link to the tclOO functions in the Tcl C API

举个我不能做的简短例子:

#include <tcl.h>
#include <tclOO.h>

int main(void) {
    Tcl_Interp *interp = Tcl_CreateInterp();
    Tcl_Obj *obj = Tcl_NewStringObj("myObject", -1);
    Tcl_Object object = Tcl_GetObjectFromObj(interp, obj);
    return 0;
}

然后编译:

gcc main.c -o tclOOTest -ltcl

我当然会从 linker 那里得到一个错误,因为我不是 link 反对具有 Tcl_GetObjectFromObj 定义的库。问题是我不知道 link 反对哪个图书馆。我认为 tclOO 自 8.6 以来就内置于 tcl 中(这是我正在使用的)。

这是错误:

/tmp/ccZnpdY8.o: In function `main':
main.c:(.text+0x33): undefined reference to `Tcl_GetObjectFromObj'
collect2: error: ld returned 1 exit status

TclOO API,与其他大部分 Tcl 不同,它仅通过存根 table 导出自身。在你 #include Tcl 头文件之前,你应该 #define 符号 USE_TCL_STUBS 为 1,并且 link 对 tclstub 库。 (无论如何,这是构建扩展的推荐方式。)

[编辑]:如果您在程序中嵌入 Tcl,则需要 more complex procedure。基本上,您需要将程序划分为应用程序部分和 内部 扩展部分。调用 Tcl_CreateInterp 的部分最有可能是应用程序部分,而访问 TclOO API 的部分是扩展(并且需要调用 Tcl_InitStubsTcl_OOInitStubs初始化函数)。

扩展部分需要编译时定义USE_TCL_STUBS。 (因为它很重要,您可以将其作为 #define 放在文件顶部。维基页面也提到 USE_TCLOO_STUBS,但 USE_TCL_STUBS 暗示了这一点。)扩展部分需要在没有它的情况下建造。在启动 运行 任何(非内置)脚本之前,您可以在 Tcl_CreateInterp 调用之后立即调用安装内部扩展的初始化函数。然后当你 link 一切你 link both 反对 libtclstublibtcl.

这种复杂性的原因是 TclOO 本身作为一个单独的扩展开始,并且从不支持外部 API 引用。我可能应该放宽对 Tcl 8.7 的限制……