gpt4 book ai didi

c - 如何链接到 Tcl C API 中的 tclOO 函数

转载 作者:太空宇宙 更新时间:2023-11-04 07:58:32 25 4
gpt4 key购买 nike

作为我不能做的事的一个简短例子:

#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

我当然会从链接器中得到错误,因为我没有链接到具有 Tcl_GetObjectFromObj 定义的库。问题是我不知道要链接到哪个库。我认为 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 不同,它仅通过 stub 表导出自身。在#include Tcl 头文件之前,您应该#define 符号USE_TCL_STUBS 为1,并链接到tclstub库。 (无论如何,这是构建扩展的推荐方式。)

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

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

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

关于c - 如何链接到 Tcl C API 中的 tclOO 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48361869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com