`

Tcl/Tk Insight: C/C++ 扩展

阅读更多
Tcl 作为一种脚本语言,有其优点,因而在C/C++程序中加入执行Tcl脚本的能力,可以提供脚本。
Tcl 作为一种脚本语言,终有其局限性。比如速度和某些功能。在Tcl中调用 C/C++ 使得 Tcl 可以扩展。

Tcl/Tk 和 C/C++ 的关系可以概括为三种情况:

    在C/C++程序里面执行 Tcl 语句。 (Tcl Interpreter)
    在 Tcl 中调用 C/C++ 实现的功能。 (Tcl Package)
    C/C++程序本身是基于 Tcl/Tk 的程序。(Big Wish)

在C/C++程序里面执行 Tcl 语句 (Tcl Interpreter)

    Adding Tcl/Tk to a C application

由于Tcl语言是解释器执行语言,可以想象问题的关键是知道解释器对象和要执行得Tcl语句。
Tcl解释器(Tcl Interpreter)的创建和管理

// 创建一个解释器
Tcl_Interp *interp = Tcl_CreateInterp();

// 执行"init.tcl"进行初始化
if ( Tcl_Init( interp ) != TCL_OK ) {
     // Error
}

if(Tcl_InterpDeleted(interp) != 0){
  // 解释器 已经被删除了
}

// 通过解释器来使用Tcl
const char *script = "set t 3 ; puts $t";
Tcl_Eval(interp,script );
// 删除这个解释器
Tcl_DeleteInterp(interp);

Tcl解释器中命令的执行

/* 执行一段命令, 命令内容保存在 objPtr 中 */
int Tcl_EvalObjEx(Tcl_Interp *interp, Tcl_Obj *objPtr, int flags);
/************************************************
* 第一次执行时,命令会被编译成字节码
***********************************************/

/* 执行一个文件, 相对于 source 语句 */
int Tcl_EvalFile(Tcl_Interp *interp, const char *fileName);

/* 执行一段命令, 命令内容保存在字符串中 */
int Tcl_Eval(Tcl_Interp *interp, const char *script );
int Tcl_EvalEx(Tcl_Interp *interp, const char *script, int numBytes, int flags);
/************************************************
* 直接解析执行,不会编译成字节码
***********************************************/
/* 执行一条命令 */
int Tcl_EvalObjv(Tcl_Interp *interp, int objc, Tcl_Obj **objv, int flags);

在 Tcl 中调用 C/C++ 实现的功能 (Tcl Package)

这个常用于扩展包。

在Tcl中读入编译好的C/C++程序模块(.so 文件或者.dll文件)。

    Tcl 通过命令 load 加载编译好的程序模块

    load filename.so pkgName
    # Tcl解释器将会调用C/C++ 模块种特定的函数(pkgName_Init/pkgName_SafeInit) 作为程序入口。
    # 该入口函数通常用来添加Tcl命令。

    # 默认是读入当前的解释器。也可以指定解释器如下
    load filename.so pkgName interp

    C/C++

    /************************************************
    * 以下两者之一是函数原型
    * 后者用于safe intepreter
    *************************************************/
    int pkgName_Init(Tcl_Interp *interp);
    int pkgName_SafeInit(Tcl_Interp *interp);

    //e.g.
    int pkgName_Init(Tcl_Interp *interp){

    }

    关于如何在C中创建新的Tcl命令,稍后介绍。

C/C++程序本身是基于 Tcl/Tk 的程序

这种程序的好处是,在拥有C的强大计算能力的同时,提供给用户一个交互式界面。
如果加上Tk,还可以实现GUI。这样的程序有时也被称作 //bigwish//

    Hello World 程序。执行起来就像是一个Tcl Shell。

#include <tk.h>
#include <tcl.h>
#include <iostream>

typedef int Tcl_AppInitProc(Tcl_Interp *interp);

int appInitProc(Tcl_Interp *interp){
    std::cout<<"App Init"<<std::endl;
    Tcl_Init(interp);
    Tk_Init(interp);

    Tk_Window topwin = Tk_MainWindow(interp);
    Tk_SetAppName(topwin,"NOYESNO");
    Tcl_Eval(interp,"wm title . NOYESNO");
    //Tcl_EvalFile(interp,"debug.tcl");
    return 0;
}

int main(int argc, char** argv){
    Tk_Main(argc, argv, appInitProc);
    //Tk_MainLoop();
    return 0;
}

实际应用中常主要的问题是初始化。包括下面几项任务
设置环境变量 TCL_LIBRARY 和 TK_LIBRARY

    这两个变量是用于帮助定位 init.tcl 和 tk.tcl

方法一:

    const char *argv0 = Tcl_GetNameOfExecutable();
   
    char exec_dir[255];
    strcpy(exec_dir,argv0);
    char *pos = strrchr(exec_dir,'/');
    *pos = '\0';
   
   
    char buf[255];
    sprintf(buf,"TCL_LIBRARY=%s/lib/tcl8.5",exec_dir);
    putenv(buf);

方法二:

    const char *argv0 = Tcl_GetNameOfExecutable();
    const char *tcl_init =
      "set t [file dirname [info nameofexecutable]] \n"
      "set env(TCL_LIBRARY) [file join $t lib tcl8.5] \n"
      "set env(TK_LIBRARY)  [file join $t lib tk8.5] \n"
      "unset t"
      ;
     
    if (Tcl_Eval(interp,tcl_init) != TCL_OK){
        return TCL_ERROR;
    }
   

应该说还是第一种方法作为C/C++程序来说更纯粹些。
设置默认字符编码

Tcl_SetSystemEncoding(interp,"utf-8");
Tcl_SetDefaultEncodingDir("/some/path/lib/tcl8.5/encoding");

执行初始化脚本

    const char *nyno_init_file = "noyesno.tcl";
    if(access(nyno_init_file,R_OK) == 0){
        Tcl_EvalFile(interp,nyno_init_file);
    }

参考资源

    Embedding vs. Extending
    How to embed Tcl in C applications

分享到:
评论

相关推荐

    libX11-1.5.0.tar.gz 的tar包

    解决ubuntu安装GDK编译不通过问题 ... from /GDB/insight-6.8-1/tk/unix/../generic/tk3d.c:16: /GDB/insight-6.8-1/tk/unix/../generic/tk.h:96: fatal error: X11/Xlib.h: No such file or directory

    人脸识别2:InsightFace实现人脸识别Face Recognition(含源码下载).txt

    人脸识别3:C/C++ InsightFace实现人脸识别Face Recognition(含源码):https://blog.csdn.net/guyuealian/article/details/130600571 人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码):...

    人脸识别3:C++ InsightFace实现人脸识别Face Recognition(含源码).txt

    人脸识别3:C/C++ InsightFace实现人脸识别Face Recognition(含源码):https://blog.csdn.net/guyuealian/article/details/130600571 人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码):...

    人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码).txt

    人脸识别3:C/C++ InsightFace实现人脸识别Face Recognition(含源码):https://blog.csdn.net/guyuealian/article/details/130600571 人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码):...

    insight:用于Bitcore Insight API的Golang软件包

    Bitcore Insight API-Golang 一个小的golang程序包,可帮助您将Bitcore Insight API与Golang一起使用。 连接到Insight API // import "github.com/hunterlong/insight" bitcoin := insight . New ( ...

    Astyle/sourceinsight

    **标题解析:** "Astyle/sourceinsight" 指的是 ...综上所述,Astyle 和 Source Insight 的结合使用,能为 C/C++ 开发者提供高效、一致的代码格式化体验,同时保持强大的代码分析能力,从而提升开发效率和代码质量。

    人脸识别1:人脸识别数据集.txt

    人脸识别3:C/C++ InsightFace实现人脸识别Face Recognition(含源码):https://blog.csdn.net/guyuealian/article/details/130600571 人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码):...

    年龄识别, 性别识别, 图片分类, 人脸特征点检测模型资源

    Java + OpenCV 系列专栏已经亲测可用 博客地址: https://yinyue.blog.csdn.net/article/details/115827069 ...图片分类: bvlc_googlenet.prototxt , ...synset_words.txt 年龄识别: age_deploy.prototxt ...lbfmodel.yaml

    ADAMS教程,非常不错的一个培训教程,希望能帮助初学者解决问题

    * A/Solver:求解核心器,含运动、(准)静定、动力学的线性及非线性分析,可与C++或Fortran结合,提供无限制分析空间。 * A/Postprocessor:加强型独立后处理器,提供后分析数据的整合,以及动画及分析图表的数据...

    Source Insight 4.0 C、C++代码查看工具软件.zip

    《Source Insight 4.0:C、C++代码查看与编辑利器》 Source Insight是一款备受程序员喜爱的代码查看和编辑工具,尤其在C和C++编程领域中具有极高的口碑。其最新版本4.0更是集成了众多实用功能,极大地提升了开发...

    SourceInsight3.5 C/C++语言 源代码查看工具 破解版

    SourceInsight3.5 C/C++语言 源代码查看工具 破解版

    sourceinsight4087

    Fix: C/C++ Source File: added *.hh file association Fix: Project > Add and Remove Project Files - fixed keyboard short cut in prompt to add top level sub-directories. Fix: Crash could happen when ...

    sourceinsight 4.0.0085-4.0.0086最新版破解 亲测可用

    sourceinsight_4.0破解 1. 安装原版软件:Source Insight Version 4.0.0085/Source Insight Version 4.0.0086 2. 替换原主程序:sourceinsight4.exe 3. 导入授权文件(Import a new license file):si4.pediy.lic

    source insight and windows via c++

    《Source Insight and Windows via C++》这一主题涵盖了两个主要方面:Source Insight的使用以及通过C++在Windows平台上的编程。Source Insight是一款强大的源代码阅读、分析和编辑工具,而C++则是一种广泛应用的...

    windows gdb 可视化 调试 insight mingw

    在Windows环境下,虽然MinGW和Insight可能不如Visual Studio等IDE直观,但它们提供了更多底层控制和灵活性,特别适合对C和C++代码进行深度调试。 总的来说,结合MinGW提供的GDB和Insight的可视化界面,Windows用户...

    Software Testing

    <br/>Publisher: Sams Publishing <br/>Pub Date: July 26, 2005 <br/>ISBN: 0-672-32798-8 <br/>Pages: 408 <br/> <br/>* Overview *<br/>Software Testing, Second Edition provides practical insight into the ...

    Source Insight 3.5 序列号

    - **多语言支持**:支持 C/C++、C#、Java 等多种编程语言。 - **更灵活的项目管理**:改进了项目组织结构,使得管理更加高效。 ### 三、序列号的重要性 #### 1. 合法授权 对于 Source Insight 这样的商业软件而言...

    SourceInsight工具,c++/c的强大卡发工具

    SourceInsight是一款备受推崇的源代码分析和编辑工具,尤其在C++和C语言的开发领域中,它以其高效、智能的特性赢得了广大程序员的青睐。相较于Visual C++(VC)这样的传统集成开发环境(IDE),SourceInsight在代码...

    Source-Navigator Tutorial

    Source-Navigator 支持C, C++, Java, Tcl, [incr Tcl], FORTRAN 和 COBOL, 并且提供SDK给开发者开发自己的语言解析器 你可以使用Source-Navigator: 分析某处源码的变化对其他模块的影响 查找某个函数被调用的...

    SAS操作入门

    - **利用子系统INSIGHT输入或调用数据**:使用SAS/INSIGHT界面导入数据。 - **利用子系统SAS/STAT-Analyst Application输入或调用数据**:通过特定的界面操作导入数据。 - **数据集的拆分、合并(纵向)和拼接(横向)...

Global site tag (gtag.js) - Google Analytics