Вы пишете Tcl или C там? Путаница в том, что является причиной всех этих ошибок.
Предполагая, что вы просто пишете Tcl для всплывающего графического интерфейса Tk, который что-то делает, вы создаете файл с именем hello.tcl
со следующим содержимым:
package require Tk
proc hello {} {
puts "Hello C++/Tk!"
}
button .b -text "Say Hello" -command hello
pack .b -padx 20 -pady 6
Затем вы запускаете это с:
wish hello.tcl
Чтобы запустить это из программы на C, вам нужно проделать дополнительную работу.
#include <tcl.h>
#include <tk.h>
int main(int argc, char **argv) {
Tcl_Interp *interp;
Tcl_FindExecutable(argv[0]);
interp = Tcl_CreateInterp();
Tcl_Eval(interp,
"package require Tk\n"
"proc hello {} {\n"
"puts \"Hello C++/Tk!\"\n"
"}\n"
"button .b -text \"Say Hello\" -command hello\n"
"pack .b -padx 20 -pady 6\n");
Tk_MainLoop();
Tcl_DeleteInterp(interp);
return 0;
}
Строковый литерал, разбитый на несколько строк, должен быть достаточно узнаваемым. Возможно, вы захотите использовать Tcl_EvalFile
вместо этого, чтобы ввести скрипт для запуска из другого файла, потому что написание всех этих обратных косых черт для цитирования становится утомительным. Существуют также альтернативы Tk_MainLoop
, каждый из которых включает в себя Tcl_DoOneEvent
где-то (Tk_MainLoop
также является оберткой), но я пока не могу сказать, что для вас лучше, на основании свидетельств.
Скомпилируйте приведенный выше код, ссылаясь на libtk и libtcl в указанном порядке . Я не могу вспомнить, нужно ли вам явно ссылаться на библиотеку X11, или будет достаточно ссылки на Tk.