【问题标题】:Tcl-C - can't require specific package when running Tcl Interperter from CTcl-C - 从 C 运行 Tcl Interperter 时不需要特定的包
【发布时间】:2018-11-19 04:17:56
【问题描述】:

我想用 Tcl 扩展我的 C/C++ 应用程序。 我编写了以下应该创建 Tcl 解释器的代码,但我希望它加载位于 ./user/tcl8.6.6/lib 的用户包。

问题是我的程序没有加载任何东西就存在。 因此,在我调试程序之后,我看到运行应该需要我的包的行后解释器中的结果是:*myinterp = {result = 0x647d58 "can't find package user", freeProc = 0x0, errorLine = 1}

我假设此行调用的 Tcl Interperter 位于其 lib 子文件夹下没有此包的某个位置。

所以我的问题是如何查看被调用的 shell 的路径(可能与 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;
 }

【问题讨论】:

  • 将相关目录添加到auto_path列表中:lappend auto_path /path/to/package
  • 那是 C++,不是 C,顺便说一句...
  • 哎呀...我的错误谢谢

标签: c tcl


【解决方案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 从哪里得到它的 internal 库脚本。我想如果你嵌入 Tcl 并且没有单独安装它,你可能需要设置它,但这不是找到非内置包的地方。

【讨论】:

  • 我有一个奇怪的问题。我正在加载的解释器没有 tcl_library 也没有 auto_path(在设置它们之前)我认为这是我的问题,但我不知道如何更改它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多