deepin编译c语言,deepin20编译ckermit

deepin20编译ckermit

由于deepin20的软件仓库里面没有ckermit,所以只能自行编译了,期间遇到了一些坑,记录一下

一、在哥伦比亚大学官网下载最新的ckermit源码

这个下载地址不好找,或者又是下载不动,很麻烦,我这里也有下载好的

二、编译源码

解压进入源码目录,执行make linux

报错:ckucmd.c: In function ‘cmdconchk’:

ckucmd.c:7385:48: error: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_cnt’

debug(F101,"cmdconchk stdin->_cnt","",stdin->_cnt);

^~

ckcdeb.h:5129:51: note: in definition of macro ‘debug’

((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’

x = stdin->_cnt;

^~

分析ckucmd.c:7385源代码:/* Here we must look inside the stdin buffer - highly platform dependent */

#ifdef _IO_file_flags /* Linux */

x = (int) ((stdin->_IO_read_end) - (stdin->_IO_read_ptr));

debug(F101,"cmdconchk _IO_file_flags","",x);

#else /* _IO_file_flags */

#ifdef USE_FILE_CNT /* Traditional */

#ifdef VMS

debug(F101,"cmdconchk (*stdin)->_cnt","",(*stdin)->_cnt);

x = (*stdin)->_cnt;

#else

#ifdef NOARROWKEYS

debug(F101,"cmdconchk NOARROWKEYS x","",0);

#else

debug(F101,"cmdconchk stdin->_cnt","",stdin->_cnt);

x = stdin->_cnt;

#endif /* NOARROWKEYS */

根据注释来看,这段代码是高度平台相关的。而我经过搜索得知,在linux下stdin结构体是没有_cnt成员的,而在msvc下才有这个成员,所以肯定是错误地执行了#ifdef分支,应该要执行注释为/* Linux */的分支,可是由于宏定义_IO_file_flags不存在,执行了/* Traditional */分支。所以我们需要手动把宏定义加进去

三、解决第一个错误

编辑makefile中的linuxa目标: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 -D_IO_file_flags \

-DCK_NEWTERM -DTCPSOCKET -DLINUXFSSTND -DNOCOTFMC -DPOSIX \

-DUSE_STRERROR $(KFLAGS)" "LNKFLAGS = $(LNKFLAGS)" \

"LIBS = $(LIBS) -lm"

在CFLAGS后面加上-D_IO_file_flags

继续执行make linux

编译成功,但是链接报错/usr/bin/ld: ckuusx.o: in function `shocps':

ckuusx.c:(.text+0xdb): undefined reference to `stdscr'

/usr/bin/ld: ckuusx.c:(.text+0xe0): undefined reference to `wmove'

/usr/bin/ld: ckuusx.c:(.text+0xf6): undefined reference to `printw'

/usr/bin/ld: ckuusx.c:(.text+0xfd): undefined reference to `stdscr'

/usr/bin/ld: ckuusx.c:(.text+0x102): undefined reference to `wclrtoeol'

/usr/bin/ld: ckuusx.c:(.text+0x17f): undefined reference to `stdscr'

/usr/bin/ld: ckuusx.c:(.text+0x184): undefined reference to `wmove'

/usr/bin/ld: ckuusx.c:(.text+0x1f8): undefined reference to `printw'

后面还有类似的好多错误信息,我就不贴了,搜索一下,似乎是缺少curses库造成的

四、解决第二个错误

编辑makefile文件,在linuxa目标的-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 -D_IO_file_flags \

-DCK_NEWTERM -DTCPSOCKET -DLINUXFSSTND -DNOCOTFMC -DPOSIX \

-DUSE_STRERROR $(KFLAGS)" "LNKFLAGS = $(LNKFLAGS)" \

"LIBS = $(LIBS) -lm -lcurses"

似乎还要安装一下curses库,反正我装了sudo apt install libncurses5-dev

继续执行make linux

编译链接成功,在源码根目录生成wermit可执行文件

运行一下juju@juju-PC:~/ckermit$ ./wermit

?SET SPEED has no effect without prior SET LINE

C-Kermit 9.0.302 OPEN SOURCE:, 20 Aug 2011, for Linux (64-bit)

Copyright (C) 1985, 2011,

Trustees of Columbia University in the City of New York.

Type ? or HELP for help.

(/home/juju/ckermit/) C-Kermit>exit

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值