C++应用程序使用TCL API启用程序包自动加载

C++ Application using TCL API to enable package autoloading

本文关键字:启用 程序 包自动 加载 API TCL 应用程序 C++      更新时间:2023-10-16

我想让我的C++应用程序为C:Tcllib中的所有ActiveTcl包启用包自动加载。我在C++代码中将下面的tcl命令传递给Tcl_Eval()。预计"package require <package name>"将自动找到包裹并加载。

set ::auto_path [file join {C:Tcllib}]

但它并不像在TCL shell中那样工作——TCL shell在auto_path中查找pkgIndex.tcl,所以当"package require"时,它可以找到正确的包或共享库。有可能使它在C++应用程序中工作吗?或者有更好的方法吗?

好吧,我想我知道问题出在哪里了。auto_path是一个目录的Tcl列表,使用它的代码用foreach在列表上迭代,搜索包(和自动加载的脚本,我认为这是一种旧机制,它的麻烦比它的价值大得多)。然而,您使用的是单个元素,即file join的输出。在Windows以外的平台上,这通常无关紧要,因为目录分隔符是/(这只是Tcl的一个普通非空白字符),但在Windows上,目录分隔符为,这是Tcl的列表元语法字符。

这是什么意思?嗯,在之后

set ::auto_path [file join {C:Tcllib}]

我们可以问列表中的内容是什么。例如,我们可以打印列表的第一个元素…

puts [lindex $::auto_path 0]

它的输出是什么?可能是这样的:

C:Tcllib

哦!反斜杠被当作引号,留下了一个完全不起作用的路径。那行不通。

解决方法是使用不同的方法来构建auto_path。我想你会发现这正是你真正想要的:

set ::auto_path [list {C:Tcllib}]

尽管这是一种替代方案(仍然使用list;在所有情况下,它最适合无故障列表构建):

set ::auto_path [list [file normalize {C:Tcllib}]]

(我敢打赌,你正试图将file join用作贫民区file normalize。不要这样做。很长一段时间以来,这一直是一种糟糕的做法,尤其是现在我们有了一个可以做你想做的事情的命令。)