代码之家  ›  专栏  ›  技术社区  ›  ratchet

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

  •  0
  • ratchet  · 技术社区  · 8 年前

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

    #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\u GetObjectFromObj定义的库进行链接。问题是我不知道该链接哪个库。我以为tclOO是从8.6版(我现在使用的是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
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Donal Fellows    8 年前

    tclooapi与其他Tcl不同,它只通过stubs表导出自己。你应该 #define 符号 USE_TCL_STUBS 在你之前成为1 #include Tcl头文件,并针对 tclstub 图书馆(无论如何,这是构建扩展的推荐方式。)

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

    扩展部分需要使用 使用\u TCL\u存根 定义(因为这很关键,你可以把它作为 #定义 在文件的顶部。wiki页面提到 USE_TCLOO_STUBS 同样,但这意味着 使用\u TCL\u存根 .) 扩建部分需要在没有它的情况下建造。您可以调用初始化函数,该函数在 Tcl\U CreateInterp 调用,然后再开始运行任何(非内置)脚本。然后当你链接所有你链接的东西 二者都 反对 libtclstub libtcl .