C++应用程序使用TCL API启用程序包自动加载
C++ Application using TCL API to enable package autoloading
我想让我的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
。不要这样做。很长一段时间以来,这一直是一种糟糕的做法,尤其是现在我们有了一个可以做你想做的事情的命令。)
- 我的web应用程序的用户需要在浏览器上手动启用本机客户端吗
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- 在 C++/CLI/C# 项目中启用"Native Code Debugging"导致应用程序崩溃
- QSocketNotifier:不能从另一个线程启用或禁用套接字通知程序
- 启用从程序内部取消 openmp 线程
- 如何在Windows应用程序中启用通用控件
- Eclipse:如何启用编译选项,在C++中编译错误,OpenCL程序
- C++应用程序使用TCL API启用程序包自动加载
- 从Win32/MFC应用程序中启用时无法使用JNI
- 如何在QT windows应用程序中启用SSL
- 启用arch:SSE2会使程序变慢
- 是否使用LDAP+kerberos作为身份验证程序启用SASL(带有GSSAPI)的客户端和服务器?(单点登录SSO系统
- 为什么启用 Windows 基本筛选引擎服务后,我的应用程序无法接收 UDP 数据包?
- 如何检查驱动程序代码签名策略是否已启用并实际工作
- 如何启用MongoDB C++驱动程序自动连接功能
- 如何在Boost程序选项中启用其他选项而不使用变量
- 使用SetupDI API功能,禁用启用COM端口设备驱动程序需要以管理员身份运行
- 为C++应用程序启用核心转储(通过 apache -> Perl -> C++ 调用)
- 启用-msse、-msse2和mfpmath=sse会让我的程序运行得更快吗
- 如何仅为特定程序启用无密码SSH