我想在另一个“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 ......."
}
答案 0 :(得分:4)
要从C代码评估脚本,请使用Tcl_Eval()
或其近亲之一。要使用该API,您需要链接Tcl库initialize the Tcl library和create 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