我正在使用在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(口譯, 「TESTLIB」, 「1.6」);從主體,包裝變得不可見。另外我注意到testlib_Init和testlib_SafeInit沒有被調用。我期待他們必須從package require testlib中調用。根據我的理解,每個軟件包必須在auto_path或tcl_pkgPath中包含pkgIndex.tcl,它必須包含行 (package ifneeded testlib 1.6 {load {} testlib}),但這裏兩個變量都不包含這樣的索引文件。
這是提供軟件包的正確方法嗎?是否有與使用靜態庫提供軟件包相關的文檔?