发信人: BlueOcean (Blue), 信区: Linux
标  题: CXterm5.0在RedHat5.0-下的编译解决方案
发信站: BBS 水木清华站 (Fri Feb  6 13:29:38 1998)

 【 在 scaner (永远不变坏) 的大作中提到: 】
∶ cxterm-5.0在redhat-5.0中无法成功编译,主要的
∶ 原因是redhat5.0的libc是glibc,而include文件的
∶ 结构也有很大变化。
∶ 解决的办法是该改的地方就得改,反正不用考虑多
∶ 平台编译,也就不用多考虑的很周全。凡是编译时
∶ 遇到未定义的符号,就到/usr/include里去找相应
∶ 的定义,再去改源程序。
∶ 再说一句。main.c里的什么ECHO,C80,B9600什么的
∶ 原来是定义在/usr/include/bsd/sgtty.h里的,
∶ redhat-5.0是在/usr/include/tarmbits.h里。
 

托suxm的福, 我也装了一个RedHat5.0, 觉得还可以, 不过include文件变化很大,
更加地遵从POSIX标准了. 不过系统少了一个头文件, 即/usr/include/sys/termio.h
其文件内容如下, (很简单, 以前的Linux都是有的)

------8<------8<------8<------

/*
 * Added by Michael L. in compliance with SYSTEM V termio
 */

#ifndef _SYS_TERMIO_H
#define _SYS_TERMIO_H

#include <termio.h>

#endif  /* _SYS_TERMIO_H */

------>8------>8------>8------

另外, 关于CXTERM的编译我的经验是只将cxterm的源码改写两处即可.

1. main.c
line 147:

#ifdef USE_TERMIOS
#include <termios.h>
/* this hacked termios support only works on SYSV */
#define USE_SYSV_TERMIO
#define termio termios
#undef TCGETA
#define TCGETA TCGETS
#undef TCSETA
#define TCSETA TCSETS
#else /* USE_TERMIOS */
/* #ifdef SYSV */                       <--- Here
#include <sys/termio.h>
/* #endif */ /* SYSV */                 <--- Here
#endif /* USE_TERMIOS else */

现在大多数UNIX都是和SYSTEM V兼容的, 这样的改动可以保证在大多数情况下都适用.

2. misc.c
line984:

char *SysErrorMsg (n)
    int n;
{
/*    extern char *sys_errlist[]; */    <--- Here
    extern int sys_nerr;

    return ((n >= 0 && n < sys_nerr) ? sys_errlist[n] : "unknown error");
}

主要是gcc的类型检查比较严格, sys_errlist在stdio.h中已有定义, 也可以利用
gcc的-traditional来不让gcc报错.

觉得cxterm的编写一开始就没注意跨平台的移植性, 总是哪出了毛病就补哪. 有太多的
不可移植的隐患, 需要整理一下了, :(

--
Buck barks in the darkness
 
 
 
 
Su Baochen--LinuxMan wrote:

> 宫博士,我也发现了这个问题,不过我是这样解决的,不知可否?
>
> Min Gong wrote in message <35ABB0E8.CB88B0CC@roska.hut.fi>...
> >今天在RH-5.1下重新编译cxterm-5.0遇到了问题。
> >现在已经解决了,向大家报告如下:
> >
> >1,有一个系统头文件缺失,
> >  /usr/include/sys/termio.h
>
> 我改成了/usr/include/sys/termios.h

我那做法是为了照顾兼容性,在/usr/include/sys目录中应该有那个文件,不然还可能有别的软件有相同的问题。另外termio.h包含了两个文件,
<termios.h>和<sys/ioctl.h>,在程序中如果出于别的原因已经包含了
<sys/ioctl.h>当然就没问题了否则就会有问题。

>
>
> 因为我发现在/usr/include/sys/里没有termio.h,反而有一个termios.h,就试着改
> 了。这样改了,也能行(我也改了你指出的下面的定义冲突的问题),不知是否走的
> “正道”?
>

这个解决当然是正道。因为老的编译器的变量类型检查不严格,不会发现向说明为常量的变量中赋值的错误,常量说明被忽略,因而编译可以通过。

新的编译器不允许这种行为,在语法和语意上当然是正确的了。不严格的
表达方式当然应该修改为更为严格的表达。

宫敏

--
----
NT=No Thanks, WWW=World Wide Wait
Does PnP mean "Plug and Pray"?
 
 

本文转自中文Linux论坛