如何在c代码中使用tcl apis

时间:2012-12-13 05:51:07

标签: tcl

我想在另一个“c”代码文件中使用我的tcl代码的一些功能(API)。但我没有得到如何做到特别是如何链接他们。为此,我采用了一个非常简单的tcl代码,其中包含一个API,它添加两个数字并打印总和。任何人都可以告诉我如何调用这个tcl代码来获得总和。我怎么能写一个调用这个tcl代码的c包装器。下面是我正在使用的示例tcl程序:

#!/usr/bin/env tclsh8.5
proc add_two_nos { } {

set a 10

  set b 20

  set c [expr { $a + $b } ]

  puts " c is $c ......."

}

2 个答案:

答案 0 :(得分:4)

要从C代码评估脚本,请使用Tcl_Eval()或其近亲之一。要使用该API,您需要链接Tcl库initialize the Tcl librarycreate an interpreter以保存执行上下文。另外,你真的应该做一些工作来检索结果并将其打印出来(打印脚本错误特别重要,因为这有助于批次进行调试!)

因此,你得到这样的东西:

#include <tcl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    Tcl_Interp *interp;
    int code;
    char *result;

    Tcl_FindExecutable(argv[0]);
    interp = Tcl_CreateInterp();
    code = Tcl_Eval(interp, "source myscript.tcl; add_two_nos");

    /* Retrieve the result... */
    result = Tcl_GetString(Tcl_GetObjResult(interp));

    /* Check for error! If an error, message is result. */
    if (code == TCL_ERROR) {
        fprintf(stderr, "ERROR in script: %s\n", result);
        exit(1);
    }

    /* Print (normal) result if non-empty; we'll skip handling encodings for now */
    if (strlen(result)) {
        printf("%s\n", result);
    }

    /* Clean up */
    Tcl_DeleteInterp(interp);
    exit(0);
}

答案 1 :(得分:0)

我想我已经解决了这个问题。你是对的。问题在于我使用的include方法。我有文件tcl.h,tclDecls.h和tclPlatDecls.h包含在c代码中,但这些文件不存在于路径/ usr / include中,所以我将这些文件复制到该目录,可能是不合适的做的方式。最后我没有将这些文件复制到/ usr / include并在编译时给出了包含路径。我已创建可执行文件,它在终端上提供了正确的结果。谢谢你的帮助。

以下是我使用的确切c代码:

#include <tcl.h>
#include <tclDecls.h>
#include <tclPlatDecls.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main (int argc, char **argv) {
Tcl_Interp *interp;
int code;
char *result;

printf("inside main function \n");
//    Tcl_InitStubs(interp, "8.5", 0);
Tcl_FindExecutable(argv[0]);
interp = Tcl_CreateInterp();
code = Tcl_Eval(interp, "source simple_addition.tcl; add_two_nos");

/* Retrieve the result... */
result = Tcl_GetString(Tcl_GetObjResult(interp));

/* Check for error! If an error, message is result. */
if (code == TCL_ERROR) {
    fprintf(stderr, "ERROR in script: %s\n", result);
    exit(1);
}

/* Print (normal) result if non-empty; we'll skip handling encodings for now */
if (strlen(result)) {
    printf("%s\n", result);
}

/* Clean up */
Tcl_DeleteInterp(interp);
exit(0);

}

要编译此代码并生成可执行文件,我使用以下命令:

gcc simple_addition_wrapper_new.c -I/usr/include/tcl8.5/ -ltcl8.5 -o simple_addition_op

我已经执行了文件simple_addition_op并得到了正确的结果

inside main function 
c is 30 .......

我特别感谢Donal Fellows和Johannes