У меня есть исполняемый файл интерпретатора tcl и библиотека с расширением.Я хочу иметь возможность создавать библиотеку динамически (загружается с помощью Tcl load
) или статически (один исполняемый файл, или загружается неявно).
Исполняемый код:
#ifdef GO_STATIC
extern int My_ext_Init(Tcl_Interp* interp);
Tcl_StaticPackage(interp, "my_ext", My_ext_Init, My_ext_Init);
My_ext_Init(interp); // THIS SHOULD NOT BE NEEDED !!
Tcl_SetVariable(interp, "is_statically_linked", "1", TCL_GLOBAL_ONLY);
#else
Tcl_SetVariable(interp, "is_statically_linked", "0", TCL_GLOBAL_ONLY);
#endif
Код библиотеки .. может быть статической или динамической библиотекой (.a или .so / .lib или .dll):
int My_ext_Init(Tcl_Interp *interp)
{
if (Tcl_PkgProvide(interp, "My_ext", "1.0") == TCL_ERROR) {
return TCL_ERROR;
}
Tcl_CreateObjCommand(interp, /*...etc...*/);
}
Код запуска tcl:
global is_statically_linked
if {$is_statically_linked} {
load {} my_ext
} else {
load my_ext my_ext
}
Проблема заключается в.. Я действительно не должен звонить My_ext_Init(interp);
, как это должно вызывать Tcl, когда я оцениваю load {} my_ext
Сделал вики сообщества, чтобы рекомендованный путь можно было здесь поставить.