如何在TCL中运行预编译的C代码?

问题描述 投票:0回答:1

我想在C中重写一些关键函数以提高速度,我正在处理大量输入数据,因此效益可能很大。

在我的环境中,我没有C编译器,因此我无法进行“在运行时编译”方法。应编译C文件,并从编译文件中调用和执行函数。我怎样才能做到这一点?

c tcl
1个回答
1
投票

您应该编写一些桥接函数并将其打包到可加载的扩展DLL(或适用于您的平台的任何正确的文件扩展名)。

一个合理的起点是sample extension。它的主要代码是generic/sample.c(它只是一个SHA-1实现,普通的C代码用旧样式编写)。将它桥接到Tcl的代码在generic/tclsample.c中,由两个函数组成。

  • Sha1_Cmd是在C中实现Tcl命令的代码。该名称是正式任意的,但类型签名不是。其中有趣的Tcl API函数是Tcl_GetIndexFromObjTcl_GetString(还有一个Tcl_GetStringFromObj也有不同的参数),Tcl_GetIntFromObjTcl_AppendResultTcl_SetObjResultTcl_NewIntObj。不同寻常的是,该函数不会调用Tcl_WrongNumArgs来处理用户传入错误数量的参数的情况。 命令实现的通常模式是首先解析参数,确定命令被要求做的是否合理并且当事情不合理时返回错误(即,Tcl异常)。然后调用底层代码来实际执行真正的任务。最后,底层代码的结果 - 包括任何报告的失败 - 被转换回可以通过Tcl的形式。这种模式非常普遍。
  • Sample_Init是在load DLL时将命令安装到Tcl的代码。名称和签名都很重要;名称必须与计算的库名称匹配后缀_Init(在这种情况下,我们期望被称为sample.dlllibsample.so或类似的东西)。请注意,它称为Tcl_InitStubsTcl_PkgProvideTcl_CreateObjCommandTcl_SetVar(或其相关功能之一)也是合理的,但这个套餐不会这样做。

编译指令往往在平台之间略有不同,但是如果你曾经在一个系统上构建了一个扩展DLL,那么其他系统实际上并没有那么不同。

将DLL转换为完整的软件包然后需要在它旁边添加一些pkgIndex.tcl,并且安装软件包会将这两个文件转储到正确的目录中(如果您正在进行系统安装,可能需要设置权限等)。你可以得到比这更复杂的东西,但这并不难。对于特定于应用程序的内容,您可以将DLL / package-index文件保存在您控制的目录中,并在执行auto_path之前扩展Tcl的package require全局变量。

© www.soinside.com 2019 - 2024. All rights reserved.