【发布时间】:2016-09-23 19:22:07
【问题描述】:
我正在开发使用以 C++ 实现的 tcl 包并链接为静态库的应用程序(应用程序是很久以前开发的)。它执行以下操作:
// Library code
extern "C" int testlib_SafeInit _ANSI_ARGS_((Tcl_Interp *interp))
{
return Tcl_PkgProvide(interp, "testlib", "1.6");
}
extern "C" int testlib_Init _ANSI_ARGS_((Tcl_Interp *interp))
{
return testlib_SafeInit(interp);
}
// Application code
extern "C" int testlib_SafeInit _ANSI_ARGS_((Tcl_Interp *interp));
extern "C" int testlib_Init _ANSI_ARGS_((Tcl_Interp *interp));
int main()
{
Tcl_Interp* interp = Tcl_CreateInterp();
Tcl_Init(interp);
Tcl_PkgProvide(interp, "testlib", "1.6");
Tcl_StaticPackage(interp, "testlib", testlib_Init, testlib_SafeInit);
Tcl_Eval(interp, "package require testlib");
std::cout << "Res = " << Tcl_GetStringResult(interp);
return 0;
}
当我删除行时 Tcl_PkgProvide(interp, "testlib", "1.6");从 main 开始,包变得不可见。我还注意到没有调用 testlib_Init 和 testlib_SafeInit。我期望它们必须从包需要 testlib 中调用。正如我从文档中了解的那样,每个包都必须在 auto_path 或 tcl_pkgPath 中有 pkgIndex.tcl ,其中必须包含行 (package ifneeded testlib 1.6 {load {} testlib}),但这里两个变量都不包含这样的索引文件。
这是提供包裹的正确方式吗?是否有与使用静态库提供包相关的文档?
【问题讨论】:
标签: tcl