我想用Tcl扩展我的C / C ++应用程序。 我编写了以下应创建Tcl解释器的代码,但我希望它加载位于./user/tcl8.6.6/lib中的用户包。
问题是我的程序存在而未加载任何东西。
因此,在调试程序之后,我发现在运行需要我的软件包的行后,解释器中的结果是:*myinterp = {result = 0x647d58 "can't find package user", freeProc = 0x0, errorLine = 1}
我假设此行调用的Tcl Interperter位于lib子文件夹下没有此程序包的位置。
所以我的问题是如何查看被调用的外壳程序的路径是什么(也许与TCL_LIBRARY或其他环境变量有关?),如何更新它或将其添加到文件夹的位置包含我的C代码中的用户软件包?
这是我编写的代码:
int main() {
Tcl_Interp *myinterp;
int status;
printf ("Your Program will run ... \n");
myinterp = Tcl_CreateInterp();
std::string test = "package require user";
status = Tcl_Eval(myinterp,test.c_str());
std::string test = "set a 5";
status = Tcl_Eval(myinterp,test.c_str());
printf ("Your Program has completed\n");
return 0;
}
答案 0 :(得分:1)
Tcl初始化从TCLLIBPATH
环境变量中加载软件包的位置,该环境变量如果定义必须包含Tcl目录列表以搜索pkgIndex.tcl
文件(定义了如何加载软件包实现)。但是,如果您知道应用程序包在哪里,则应在应用程序中将该位置附加到auto_path
全局变量的列表中:
std::string libLocation = "/some/directory/I/know";
Tcl_SetVar(interp, "auto_path", libLocation.c_str(),
TCL_GLOBAL_ONLY | TCL_APPEND_VALUE | TCL_LIST_ELEMENT);
在创建解释器之后但在评估脚本之前执行此操作。
如果可以避免,请不要设置TCL_LIBRARY
。它定义了Tcl从何处获取其内部库脚本。我想如果要嵌入Tcl而不是单独安装它,可能需要设置它,但这不是在非内置软件包中找到的地方。