ubuntu20.04编译安装ckermit
笔者之前一直使用的是ubuntu18.04,最近在安装了某个软件之后,再加上自己的操作不当最终导致ubuntu系统卡死无法进入桌面环境,早就想更新20.04的我,终于迎来了换最新版ubuntu的理由
常规安装ckermit过程(通过apt下载方式)
请参考“Linux安装kermit”这篇文章。本文主要介绍通过源码安装方式。
源码方式安装ckermit
一、源码下载
The Kermit Project | Columbia University 的C-Kermit 注:通过哥伦比亚大学下载常常会因为网络原因导致下载速度过慢,甚至无法下载
这里提供已经下载好的最新版本源码包:
百度云下载链接: C-Kermit 9.0 source
提取码: dh82
CSDN下载链接:C-Kermit 9.0 Source(注:免积分下载)
二、编译C-kermit Source
解压源码压缩包
unzip x.zip
ls
ckc302.txt ckcftp.c ckcnet.c ckcssl.h ckcxla.h ckuath.h ckufio.c ckusig.h ckuus6.c ckuver.h ckvioc.c ckvrms.h COPYING.TXT
ckcasc.h ckcker.h ckcnet.h ckcsym.h ck_des.c ckucmd.c ckuker.nr ckutio.c ckuus7.c ckuxla.c ckvioc.h ckvrtl.c makefile
ckcdeb.h ckclib.c ckcpro.c ckctel.c ck_ssl.c ckucmd.h ckupty.c ckuus2.c ckuusr.c ckuxla.h ckvker.com ckvrtl.h x.zip
ckcfn2.c ckclib.h ckcpro.w ckctel.h ck_ssl.h ckucns.c ckupty.h ckuus3.c ckuusr.h ckvcon.c ckvker.mms ckvtio.c
ckcfn3.c ckcmai.c ck_crp.c ckcuni.c ckuat2.h ckucon.c ckuscr.c ckuus4.c ckuusx.c ckvcvt.c ckvold.c ckvvms.h
ckcfns.c ckcmdb.c ckcsig.h ckcuni.h ckuath.c ckudia.c ckusig.c ckuus5.c ckuusy.c ckvfio.c ckvold.com ckwart.c
编译源码
make linux
出现错误
In file included from ckucmd.c:41:
ckucmd.c: In function ‘cmdconchk’:
ckucmd.c:7385:48: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_cnt’
7385 | debug(F101,"cmdconchk stdin->_cnt","",stdin->_cnt);
| ^~
ckcdeb.h:5129:51: note: in definition of macro ‘debug’
5129 | ((void)(deblog?dodebug(a,b,(char *)(c),(CK_OFF_T)(d)):0))
| ^
ckucmd.c:7386:14: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_cnt’
7386 | x = stdin->_cnt;
| ^~
打开报错文件ckucmd.c,定位到报错行
7371 /* Here we must look inside the stdin buffer - highly platform dependent */
7372
7373 #ifdef _IO_file_flags /* Linux */
7374 x = (int) ((stdin->_IO_read_end) - (stdin->_IO_read_ptr));
7375 debug(F101,"cmdconchk _IO_file_flags","",x);
7376 #else /* _IO_file_flags */
7377 #ifdef USE_FILE_CNT /* Traditional */
7378 #ifdef VMS
7379 debug(F101,"cmdconchk (*stdin)->_cnt","",(*stdin)->_cnt);
7380 x = (*stdin)->_cnt;
7381 #else
7382 #ifdef NOARROWKEYS
7383 debug(F101,"cmdconchk NOARROWKEYS x","",0);
7384 #else
7385 debug(F101,"cmdconchk stdin->_cnt","",stdin->_cnt);
7386 x = stdin->_cnt;
7387 #endif /* NOARROWKEYS */
7388 #endif /* VMS */
7389 if (x == 0) x = conchk();
7390 if (x < 0) x = 0;
7391 #else /* USE_FILE_CNT */
7392 #ifdef USE_FILE__CNT /* HP-UX */
7393 debug(F101,"cmdconchk stdin->__cnt","",stdin->__cnt);
7394 x = stdin->__cnt;
7395 if (x == 0) x = conchk();
7396 if (x < 0) x = 0;
7397 #else /* USE_FILE_CNT */
7398 #ifdef USE_FILE_R /* FreeBSD, OpenBSD, etc */
7399 debug(F101,"cmdconchk stdin->_r","",stdin->_r);
7400 x = stdin->_r;
7401 if (x == 0) x = conchk();
7402 if (x < 0) x = 0;
7403
7404 /* Fill in any others here... */
7405
7406 #endif /* USE_FILE_R */
7407 #endif /* USE_FILE__CNT */
7408 #endif /* USE_FILE_CNT */
7409 #endif /* _IO_file_flags */
在7371行的注释告诉我们要关注 stdin buffer
,这个 buf(struct _iobuf
也就是 FILE
结构体)和平台高度相关。而 Linux
平台下的 stdin
结构体没有 _cnt
成员,该成员在 MinGW
和 MSVC
编译环境中才有。因此这里应该执行 #ifdef _IO_file_flags
下的代码,这里需要自己把这个宏添加进去。
注:[参考链接]https://blog.mxslly.com/archives/172.html
三、解决错误
3.1、正常解决
进入 makefile
报错行 [6054],及 linuxa
的标签,在 CFLAGS
后添加-D_IO_file_flags
。
linuxa:
@echo 'Making C-Kermit $(CKVER) for Linux 1.2 or later...'
@echo 'IMPORTANT: Read the comments in the linux section of the'
@echo 'makefile if you have trouble.'
$(MAKE) xermit KTARGET=$${KTARGET:-$(@)} "CC = gcc" "CC2 = gcc" \
"CFLAGS = -O -DLINUX -pipe -funsigned-char -DFNFLOAT -DCK_POSIX_SIG \
-DCK_NEWTERM -DTCPSOCKET -DLINUXFSSTND -DNOCOTFMC -DPOSIX -D_IO_file_flags\
-DUSE_STRERROR $(KFLAGS)" "LNKFLAGS = $(LNKFLAGS)" \
"LIBS = $(LIBS) -lm"
3.2、补充
若当前系统未安装 ncurses-dev
和 libncurses5-dev
这两个库文件,则会出现如下错误。
在解决上面问题后,再次编译 ckermit
可能会出现如下错误。
imaginemiracle@:ckermit$ make linux
......
......
/usr/bin/ld: ckuusx.o: in function `shocps':
ckuusx.c:(.text+0xdd): undefined reference to `stdscr'
/usr/bin/ld: ckuusx.c:(.text+0xe2): undefined reference to `wmove'
/usr/bin/ld: ckuusx.c:(.text+0xfa): undefined reference to `printw'
/usr/bin/ld: ckuusx.c:(.text+0x101): undefined reference to `stdscr'
/usr/bin/ld: ckuusx.c:(.text+0x106): undefined reference to `wclrtoeol'
/usr/bin/ld: ckuusx.c:(.text+0x183): undefined reference to `stdscr'
/usr/bin/ld: ckuusx.c:(.text+0x188): undefined reference to `wmove'
/usr/bin/ld: ckuusx.c:(.text+0x1fa): undefined reference to `printw'
/usr/bin/ld: ckuusx.c:(.text+0x201): undefined reference to `stdscr'
/usr/bin/ld: ckuusx.c:(.text+0x206): undefined reference to `wclrtoeol'
/usr/bin/ld: ckuusx.c:(.text+0x219): undefined reference to `stdscr'
/usr/bin/ld: ckuusx.c:(.text+0x21e): undefined reference to `wmove'
/usr/bin/ld: ckuusx.c:(.text+0x236): undefined reference to `printw'
/usr/bin/ld: ckuusx.c:(.text+0x23d): undefined reference to `stdscr'
/usr/bin/ld: ckuusx.c:(.text+0x242): undefined reference to `wclrtoeol'
......
3.3、解决“undefined reference”的错误
安装上文提到的两个库文件。
sudo apt install ncurses-dev
sudo apt install libncurses5-dev
修改 makefile
文件,在 "LIBS = $(LIBS) -lm"
后添加 -lcurses
。
linuxa:
@echo 'Making C-Kermit $(CKVER) for Linux 1.2 or later...'
@echo 'IMPORTANT: Read the comments in the linux section of the'
@echo 'makefile if you have trouble.'
$(MAKE) xermit KTARGET=$${KTARGET:-$(@)} "CC = gcc" "CC2 = gcc" \
"CFLAGS = -O -DLINUX -pipe -funsigned-char -DFNFLOAT -DCK_POSIX_SIG \
-DCK_NEWTERM -DTCPSOCKET -DLINUXFSSTND -DNOCOTFMC -DPOSIX -D_IO_file_flags \
-DUSE_STRERROR $(KFLAGS)" "LNKFLAGS = $(LNKFLAGS)" \
"LIBS = $(LIBS) -lm -lcurses"
四、再次编译
再次执行 make linux
进行编译,编译成功会生成 wermit
可执行文件,将该可执行文件移动到 /usr/local/bin
目录下(为了方便使用)。
make linux
#注:该命令需要root权限
cp wermit /usr/local/bin/kermit
五、编辑.kermrc(在家目录~/
下完成)
$ cd ~
$ vim .kermrc
#.kermrc文件内容,一般USB转串口会分配为/dev/ttyuSB0,如果是用串口线连接主机的话,需要设置为/dev/ttyS0,设备名根据自己电脑识别的自行修改。
set line /dev/ttyUSB0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5
编辑完成保存退出后,若串口设置这正确,执行 sudo kermit
一直出现如下内容。
?SET SPEED has no effect without prior SET LINE
Sorry, you must SET LINE or SET HOST first
该问题出现的原因:
由于 kermit
是 root
用户的应用程序,因此在执行的时候不会在家目录 ~/
下匹配 .kermrc
文件。
只需要将配置文件 .kermrc
复制到 root
目录下即可
#注:该命令需要root权限
sudo mv ~/.kermrc /root/
到此,有关Ubuntu 20.04配置安装ckermit的文章结束
help
#查看当前设备识别到的串口
ls /dev/tty*
#正确配置kermrc后,运行kermit命令
sudo kermit
#打开并连接串口,已经进入kermit界面输入`c`回车即可
#退出到kermit命令行:在连接到串口的情况下使用组合键`Ctrl + \`之后按下`c`键,即可进入kermit的命令行界面,再输入`q`回车即可退出kermit程序
#退出到terminal命令:在连接到串口情况下使用组合见`Ctrl + \`之后按下`q`建,即可直接退出到terminal命令行界面