1

我想让我的 C++ 应用程序为C:\Tcl\lib. 我将下面的 tcl 命令传递给Tcl_Eval()我的 C++ 代码。并且期望“ package require <package name>”会自动找到包并加载它。

set ::auto_path [file join {C:\Tcl\lib}]

但它不像在 TCL shell 中那样工作 - TCL shellpkgIndex.tcl在 auto_path 中查找,所以当“ package require”时,它可以找到正确的包或共享库。是否可以使其在 C++ 应用程序中工作?或者有没有更好的方法?

4

1 回答 1

0

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

这是什么意思?好吧,之后:

set ::auto_path [file join {C:\Tcl\lib}]

我们可以问那个清单上的东西是什么。例如,我们可以打印列表的第一个元素……</p>

puts [lindex $::auto_path 0]

那输出什么?大概是这样的:

C:Tcllib

哎呀!反斜杠被视为引用字符,留下了一个完全不起作用的路径。那是行不通的。

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

set ::auto_path [list {C:\Tcl\lib}]

尽管这是一种替代方法(仍在使用list; 在所有情况下,它都是无故障列表构造的最佳选择):

set ::auto_path [list [file normalize {C:\Tcl\lib}]]

(我敢打赌,您正试图将其file join用作 ghetto file normalize。不要那样做。很长一段时间以来,这一直是不好的做法,尤其是现在我们有一个实际上可以执行您想要的操作的命令。)

于 2015-08-20T14:10:22.447 回答