gpt4 book ai didi

compilation - tcl_findLibrary 不起作用

转载 作者:行者123 更新时间:2023-12-01 21:10:34 27 4
gpt4 key购买 nike

我正在尝试运行用 Tcl&Tk 编写的新编译的程序。运行时出现错误:

felix@Astroserver:~/Документы/Simon$ sudo ./simon1
invalid command name "tcl_findLibrary"

我正在运行Ubuntu 11.04,我已经安装了Tcl&Tk(因为我能够成功构建该程序)。

如果我正在运行wish:

% tcl_findLibrary
wrong # args: should be "tcl_findLibrary basename version patch initScript enVarName varName"

有人可以帮忙吗?

main(int argc, char *argv[])
{
Tcl_Interp *interp;
int main_window;

char *args;
char buf[20]; /* intermediate storage to pass a value to TCL */
char *tcl_command; /* points to a string of a TCL command line */
int tcl_return_value;/* is either TCL_OK or TCL_ERROR */

interp = Tcl_CreateInterp();

/* Command line arguments are passed to TCL. TCL stores in argv0 the name
of the command, that is argv[0], in argv all other arguments, and in
argc the number of arguments. */

args = Tcl_Merge(argc - 1, argv+1);
Tcl_SetVar(interp, "argv", args, TCL_GLOBAL_ONLY);
ckfree(args); /* Tcl_Merge allocates memory for the returned string */

sprintf(buf, "%d", argc - 1);
Tcl_SetVar(interp, "argc", buf, TCL_GLOBAL_ONLY);

Tcl_SetVar(interp, "argv0", argv[0], TCL_GLOBAL_ONLY);

/* Create main window and do some initialization for Tcl/Tk */
main_window = Tk_Init(interp);
if (main_window != TCL_OK) {
fprintf(stderr, "%s\n", interp->result);
exit(1);
}

if (Tcl_AppInit(interp) == TCL_ERROR) {
printf("%s\n",interp->result);
exit(1);
}


/* testing if environment variable SIMON_PATH is specified */
tcl_return_value = Tcl_Eval(interp,
"if {![info exist env(SIMON_PATH)]} {"
"puts \"Environment variable SIMON_PATH is missing!\";"
"exit }");

/* Evaluate my GUI simon.tk */

/* the 33 is the lenght of the string "source $env(SIMON_PATH)/simon.tk" */
tcl_command = (char *)MyMalloc(33 * sizeof(char));
strcpy(tcl_command,"source $env(SIMON_PATH)/simon.tk");

tcl_return_value = Tcl_Eval(interp, tcl_command);
if (*interp->result != 0) printf("%s \n", interp->result);
if (tcl_return_value != TCL_OK)
{
printf("simon.tk at line: %d\n",interp->errorLine);
exit(1);
}

/* Waiting for interactive events. */

Tk_MainLoop();
}

int Tcl_AppInit(Tcl_Interp *interp)
{
if (Tcl_Init(interp) == TCL_ERROR) {
return TCL_ERROR;
}
if (Tk_Init(interp) == TCL_ERROR) {
return TCL_ERROR;
}
Tcl_CreateCommand(interp, "set_parser", SET_Parser, (ClientData) NULL,
(Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "set_c2tcl_data", SET_C2TclData,
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);

Tcl_CreateCommand(interp, "set_free_and_reset_module_data",
SET_FreeAndResetModuleData,
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "set_free_and_reset_global_data",
SET_FreeAndResetGlobalData,
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "set_reset_sim_control_parameter",
SET_ResetSimControlParameter,
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "set_random_number", SET_RandomNumber,
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "set_scale_graph_data", SET_ScaleGraphData,
(ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);

return TCL_OK;
}

最佳答案

您正在调用 Tcl_CreateInterp 而不是 Tcl_Main,这是可以的,但要求您首先调用 Tcl_FindExecutable (初始化库)。对 Tcl 的 C 接口(interface)的第一次调用必须始终是 Tcl_FindExecutableTcl_Main(因为它会为您调用 Tcl_FindExecutable)。当 Tcl 没有初始化时,各种奇怪的事情都可能出错;在这种情况下,我们不保证代码的正确运行。

看过您的代码后,我建议改用 Tk_Main (类似于 Tcl_Main,但启用了 Tk)。你最终会得到这样的代码:

static int AppInit(Tcl_Interp *interp) {
/* Basic init */
if (Tcl_Init(interp) == TCL_ERROR)
return TCL_ERROR;
if (Tk_Init(interp) == TCL_ERROR)
return TCL_ERROR;
Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit);
/* Make your commands here */
Tcl_CreateCommand(interp, "set_parser", SET_Parser, NULL, NULL);
Tcl_CreateCommand(interp, "set_c2tcl_data", SET_C2TclData, NULL, NULL);
Tcl_CreateCommand(interp, "set_random_number", SET_RandomNumber, NULL, NULL);
Tcl_CreateCommand(interp, "set_scale_graph_data", SET_ScaleGraphData, NULL, NULL);
Tcl_CreateCommand(interp, "set_free_and_reset_module_data",
SET_FreeAndResetModuleData, NULL, NULL);
Tcl_CreateCommand(interp, "set_free_and_reset_global_data",
SET_FreeAndResetGlobalData, NULL, NULL);
Tcl_CreateCommand(interp, "set_reset_sim_control_parameter",
SET_ResetSimControlParameter, NULL, NULL);
/* Can't remember if you need this */
Tcl_SetVar(interp, "tcl_rcFileName", "~/.simonrc", TCL_GLOBAL_ONLY);
/* Now your remaining initialization - assume no error for this! */
Tcl_Eval(interp,
"if {![info exist env(SIMON_PATH)]} {"
"puts \"Environment variable SIMON_PATH is missing!\";"
"exit }");
/* Read your startup code */
return Tcl_Eval(interp, "source $env(SIMON_PATH)/simon.tk");
}
int main(int argc, char **argv) {
Tk_Main(argc, argv, AppInit);
return 0; /* Not Reached */
}

关于compilation - tcl_findLibrary 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431365/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com