Я хочу иметь возможность использовать схему STK при просмотре видео.
Моя проблема похожа на Установка интерпретатора схемы STK на Ubuntu Mate , однако предоставленные ответы не помогли решить проблему проблема для меня.
Я использую
Ubuntu 20.04
GNU Make 4.2.1
g cc 9.3.0
Я пошел на https://teachyourselfcs.com/#programming и получил Berkeley Computer Science 61A от видео Брайана Харви из https://archive.org/details/ucberkeley-webcast-PL3E89002AA9B9879E?sort=titleSorter
Язык программирования, используемый для класса, - это схема STK. . Итак, я пошел и получил исходный код из http://kaolin.unice.fr/STk/Distrib/STk-4.0.1.tar.gz
. Я извлек файлы в домашний каталог моего пользователя и был готов к
./configure
make
checkinstall
* Я использую ' checkinstall 'вместо' install ', потому что он создает файл .deb, который отображается в диспетчере пакетов. По моему опыту, это упрощает дальнейшее удаление.
Когда я сделал «make», это не сработало. Получил:
make Tcl
make[1]: Entering directory '/home/USER/STk-4.0.1/Tcl'
make[1]: *** No rule to make target 'unix'. Stop.
make[1]: Leaving directory '/home/USER/STk-4.0.1/Tcl'
make: *** [Makefile:81: tcl-dir] Error 2
Я вижу, что в папке Tcl возникла какая-то проблема. Когда я заглянул в папку, в ней были файлы с именами configure и make, так что я подумал, что, возможно, причина того, что у нее нет цели make, заключается в том, что ее тоже нужно было настроить. t завершено, последняя строка сказала:
checking system version (for dynamic loading)... ./configure: 1: Syntax error: Unterminated quoted string
, поэтому я открыл файл «configure» в текстовом редакторе и поискал «системная версия». Нашел его в строке 3222. Там было написано:
system=MP-RAS-`awk '{print $3}' /etc/.relid'`
Я изменил его на
system=MP-RAS-`awk '{print $3}' /etc/.relid`
, удалив 'after /etc/.relid.
Сохранил файл и попробовал
./configure
make
снова из основной каталог.
На этот раз make снова остановился, но в новом месте. Последние несколько строк были:
make[2]: Entering directory '/home/en/STk-4.0.1/Tk/unix'
gcc -c -O2 -DSTk_CODE -DSCM_CODE -DLINUX -DUSE_STKLOS -DLINUX -DUSE_HASH -DUSE_POSIX -DUSE_SOCKET -DUSE_REGEXP -DUSE_PROCESS -DUSE_HTML -DUSE_BASE64 -DUSE_LOCALE -DUSE_PIXMAP -DUSE_JPEG -I../../Src -I. -I./../generic -I./../bitmaps -I../../Tcl/ -DHAVE_UNISTD_H=1 -DHAVE_LIMITS_H=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TIME_H=1 -DTIME_WITH_SYS_TIME=1 ./../generic/tk3d.c
In file included from ./../generic/tkInt.h:21,
from ./../generic/tk3d.h:18,
from ./../generic/tk3d.c:16:
./../generic/tk.h:75:11: fatal error: X11/Xlib.h: No >such file or directory
75 | # include <X11/Xlib.h>
| ^~~~~~~~~~~~
compilation terminated.
make[2]: *** [Makefile:475: tk3d.o] Error 1
make[2]: Leaving directory '/home/en/STk-4.0.1/Tk/unix'
make[1]: *** [Makefile:12: libtk.a] Error 2
make[1]: Leaving directory '/home/en/STk-4.0.1/Tk'
make: *** [Makefile:83: tk-dir] Error 2
Быстрый поиск показал, что отсутствующий файл X11 / xlib.h предоставляется пакетом libx11-dev, поэтому
sudo apt install libx11-dev
и повторите попытку.
.configure
make
make снова остановился, но дальше на этот раз. он сказал:
io.c: In function ‘file_data_available’:>io.c:77:38: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_cnt’
77 | # define READ_DATA_PENDING(fp) (fp->_cnt)
| ^~
io.c:115:6: note: in expansion of macro ‘READ_DATA_PENDING’
115 | (READ_DATA_PENDING(PORT_FILE(port))) );
| ^~~~~~~~~~~~~~~~~
make[1]: *** [<builtin>: io.o] Error 1
make[1]: Leaving directory '/home/en/STk-4.0.1/Snow'
make: *** [Makefile:91: snow-dir] Error 2
Теперь я застрял. Я не знаю, что означает fp->_cnt
и откуда оно взялось. Я думаю, что это последнее, что заставит его работать, потому что, если я удалю разделы кода в файле io.c
, вызывающие эту проблему, он будет работать без ошибок, но я считаю, что просто удалить его - плохая идея.
вот разделы кода c из io. c, которые могут иметь отношение
#ifdef _STDIO_USES_IOSTREAM /* GNU libc */
# if defined(_IO_STDIO_H) || defined (linux)
# define READ_DATA_PENDING(fp) (max(0,(fp)->_IO_read_end - (fp)->_IO_read_ptr))
# else
# define READ_DATA_PENDING(fp) (max(0,(fp)->_egptr - (fp)->_gptr))
# endif
#endif
#if (!defined (READ_DATA_PENDING)) && defined __SLBF
# define READ_DATA_PENDING(fp) (max(0,fp->_r))
#endif
#if !defined (READ_DATA_PENDING)
# ifdef WIN32
# define READ_DATA_PENDING(fp) (1)
# else
# define READ_DATA_PENDING(fp) (fp->_cnt)
# endif
#endif
, а затем
static int file_data_available(SCM port)
{
return ( (PORT_UNGETC(port) != EOF) ||
((port == STk_stdin) && (bufidx < count)) ||
(READ_DATA_PENDING(PORT_FILE(port))) );
}