如何在命令界面为 Tcl shell 的 C/C++ 中开发工具?



假设一个工具X需要开发,它是用C/C++编写的,并且具有Tcl通信接口,步骤或方式是什么?

我知道Tcl C API,它可以通过为它编写C扩展来扩展Tcl。

您要做的是嵌入 Tcl(完全是一个受支持的用例;Tcl记得它是一个C库),但仍然制作类似tclsh的东西。最简单的方法是:

获取tclAppInit.c的副本(例如,这是我写这篇文章时Tcl 8.6源代码树中的当前副本)并对其进行调整,可能是通过在Tcl_AppInit()函数中放置注册额外命令,链接变量等的代码;您可能可以简单地修剪一堆东西。然后直接针对 Tcl 库(没有存根)构建和链接,以有效地获得您自己的自定义 tclsh 和您的额外功能。

如果你对交互式使用不感兴趣,你可以更广泛地使用Tcl的API。非交互式使用的核心是:

// IMPORTANT: Initialises the Tcl library internals!
Tcl_FindExecutable(argv[0]);
Tcl_Interp *interp = Tcl_CreateInterp();
// Register your custom stuff here
int code = Tcl_Eval(interp, "your script");
// Or Tcl_EvalFile(interp, "yourScriptFile.tcl");
const char *result = Tcl_GetStringResult(interp);
if (code == TCL_ERROR) {
// Really good idea to print out error messages
fprintf(stderr, "ERROR: %sn", result);
// Probably a good idea to print error traces too; easier from in Tcl
Tcl_Eval(interp, "puts stderr $errorInfo");
exit(1);
}
// Print a non-empty result
if (result[0]) {
printf("%sn", result);
}

这就是你所需要的,除非你正在进行交互式使用,这就是Tcl_Main()变得非常有用的时候(它处理了很多额外的繁琐细节),示例tclAppInit.c(如上所述)展示了如何使用。

通常,SWIG(简化包装器和接口生成器)是要走的路。 SWIG主页

这样,您就可以用 C/C++ 编写代码并定义要公开的接口。

假设你有一些 C 函数要添加到 Tcl:

/* File : example.c */
#include <time.h>
double My_variable = 3.0;
int fact(int n) {
if (n <= 1) return 1;
else return n*fact(n-1);
}
int my_mod(int x, int y) {
return (x%y);
}
char *get_time()
{
time_t ltime;
time(&ltime);
return ctime(&ltime);
}

现在,为了将这些文件添加到您喜欢的语言中,您需要编写一个"接口文件",作为SWIG的输入。这些 C 函数的接口文件可能如下所示:

/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%}
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();

在 UNIX 提示符下,键入以下内容:

unix % swig -tcl example.i
unix % gcc -fpic -c example.c example_wrap.c 
-I/usr/local/include 
unix % gcc -shared example.o example_wrap.o -o example.so
unix % tclsh
% load ./example.so example
% puts $My_variable
3.0
% fact 5
120
% my_mod 7 3
1
% get_time
Sun Feb 11 23:01:07 2018

swig 命令生成一个 example_wrap.c 的文件,该文件应编译并与程序的其余部分链接。在这种情况下,我们构建了一个动态可加载的扩展,可以使用"load"命令将其加载到 Tcl 解释器中。

取自 http://www.swig.org/tutorial.html

相关内容

最新更新