включая tk.h и tcl.h в программе c - PullRequest
0 голосов
/ 09 июня 2010

Я работаю в системе Ubuntu. Моя цель в основном сделать IDE на языке C, используя инструменты GUI из TCL / TK. Я установил tcl 8.4, tk8.4, tcl8.4-dev, tk8.4-dev и в моей системе есть файл заголовков tk.h и tcl.h. Но когда я запускаю простую программу hello world, она показывает огромное количество ошибок.

#include "tk.h"
#include "stdio.h"
void hello() {
     puts("Hello C++/Tk!");
}
int main(int, char *argv[])
{
     init(argv[0]);
     button(".b") -text("Say Hello") -command(hello);
     pack(".b") -padx(20) -pady(6);
}

Некоторые из ошибок

tkDecls.h:644: error: expected declaration specifiers before ‘EXTERN’

/usr/include/libio.h:488: error: expected ‘)’ before ‘*’ token

In file included from tk.h:1559,
                 from new1.c:1:
tkDecls.h:1196: error: storage class specified for parameter ‘TkStubs’
tkDecls.h:1201: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token

/usr/include/stdio.h:145: error: storage class specified for parameter ‘stdin’

tk.h:1273: error: declaration for parameter ‘Tk_PhotoHandle’ but no such parameter

Может кто-нибудь сказать, пожалуйста, как я могу исправить эти ошибки? Пожалуйста, помогите ...

1 Ответ

1 голос
/ 06 сентября 2010

Вы пишете 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.

...