当前位置:Linux教程 - Linux - LDPS――Linux开发平台中文说明书 1.0

LDPS――Linux开发平台中文说明书 1.0



        
    作者:Georgia

    编辑:Georgia(ChinaByte-Linux专区编辑 )

    英文原文:href=http://www.freestandards.org/ldps/1.0/ldps-1.0.html
    中文由ChinaByte-Linux专区编译:http://www.chinabyte.com/builder/linux/

    版权声明:LDPS 1.0刚刚推出,为了利于我国Linux事业的发展,我们组织了编辑将英文原版编译成中文。要是您想转载该文,请保留以上的版权声明。要是您觉得文中编译不妥的地方,请来信告诉ChinaByte-Linux专区的编辑:Bruce,经过对照英文原文后,我们会马上改正错误的地方,并将您的名字写入该篇的编辑名列。

    简介

    此为Linux 开发平台说明书版本1.0。该说明书主要针对相应平台上开发的程序而设计,使得程序与2000年10月7日起发行的所有Linux 都能兼容。建议所有独立软件开发商创建的二进制应用程序都与本说明书一致。

    但是,本说明书并不是要制订一个发行标准,而是为第三方开发商如何开发最有可能被携带的程序提供建议。

    自由标准组织(Free Standards Group)下的一个委员会(Linux 标准分部,Linux Standard Base)现正负责为交叉发行软件的开发制定完整的标准,它将取代这份作为过渡作用的说明书。如果新的说明书在2000年12月31日还未出台,本说明书将进行更新。

    开发平台说明书

    具有一致性的Linux 开发平台必须包含如下的软件包:

    Linux 内核 2.2.x(x >= 14,如果可能尽量使用最近的版本)
    ftp://ftp.kernel.org/pub/linux/kernel/v2.2/

    glibc 2.1.x (2 <= x <= 3)
    ftp://ftp.gnu.org/pub/gnu/glibc/
    注意:glibc 2.1.1中的AIO有些问题,请使用glibc 2.1.3或至少glibc 2.1.2。

    XFree86 3.3.x (x >= 6)
    ftp://ftp.xfree86.org/pub/XFree86/3.3.6/

    ncurses 4.2 或 5
    ftp://ftp.gnu.org/pub/gnu/ncurses/
    注意:大部分ncurses应用程序在ncurses 4.2或5.0下编译和运行时除了ABI 外,没有任何变化(ncurses 5.0 文档的发行备注里说明了ABI改变的原因。)

    有些应用程序在从ncurses 4升级到ncurses 5时需要重新编译。受损的程序直接通过TERMTYPE 结构使用低级终端信息界面(5.0中对TERMTYPE结构进行了修改,使其可以扩展 )。

    一些应用程序使用attr_get()函数,X/Open中记录了该函数的界面从草稿到发行时的变化。它与getattrs()宏的作用相同,在X/Open Curses说明书中说明了这个attr_get()函数。ncurses 5与X/Open Curses说明书的发行版本相匹配,而ncurses 4与说明书草稿相匹配(其他一些函数也进行了相似的更改,但这些函数很少使用,一般用在长字符支持中)。

    GCC 版本egcs-2.91 或 GCC 2.95.x(x >= 2)
    ftp://ftp.gnu.org/pub/gnu/gcc/
    注意:预期GCC以后的版本生成的二进制程序(针对C,而非C++)将仍然能在当前发行的版本中运行。新版本推出时,GCC说明书也将及时更新,尤其是在现存问题提出的情况下。目前,我们不建议使用GCC 2.x,x > 95的版本,除非用于修改关键故障。

    有些情况下,您必须使用GCC快照,例如专门针对ia64或者可能是sparc64的GCC 2.96或GCC 2.97。对于ia32和alpha,应该使用GCC 2.95.x(x >= 2)。

    binutils 2.9.x.y(x >= 1)
    ftp://ftp.valinux.com/pub/support/hjl/binutils/
    注意:预期binutils以后的版本生成的二进制程序(针对C,而非C++)将仍然能在当前发行的版本中运行。新版本推出时,GCC说明书也将及时更新,尤其是在现存问题提出的情况下。目前,我们不建议使用binutils 2.w.x.y,w > 9的版本,除非用于修改关键故障。

    binutils的这些版本有一些限定条件,尤其在修正C++句柄的时候(对隐藏或保护的字符不支持)。


    --------------------------------------------------------------------------------

    可移植性指南

    glibc库与X11 库

    建议应用程序使用与说明书一致的库版本,它可以从当前发行的软件中获得。同上所述。

    建议应用程序应与glibc 和X11库组进行动态链接(另外,还需遵循LGPL中所列的一些许可要求,详见下文。)对程序进行静态链接时,C库故障与应用程序之间的链接将永久存在,这样不仅浪费内存和磁盘空间,而且(尤其是在glibc中)还可能在具有不同内核版本的系统间引起携带性错误。

    注意:在分布了静态链接库的情况下,为了满足其中一些库的许可条款,还必须提供动态链接库。动态版本应链接到与之恰好匹配的静态版本上。

    不建议使用libXaw(作为X11的一部分发行),但仍为本说明书的一部分。

    POSIX 线程

    目前,在Linux下实现线程还不能完全符合POSIX线程(POSIX.1c)说明书。由于Linux线程实现还没有成熟(内核丢失支持,而非线程库),我们不建议实施偏离POSIX标准的操作。但这种做法可能以后会有所改变,因为将来的做法将越来越与POSIX线程说明书相一致。

    因此,建议不要使用与POSIX说明书不一致的Linux线程实现功能。在不可避免的情况下,程序应该用容易提醒的确切语义书写,并且放在临时环境中(最好可以动态地启用和禁用。)

    C++

    考虑到C++ API的不稳定性(混乱的名称以及其他一些类似问题),不建议使用随同系统提供的动态C++库。如果可能,使用现有的开发工具在C++中开发应用程序。在C++中可以静态地链接libstdc++和libgcc,或者为应用程序提供这些共享库。这些共享库放置在按程序指定的目录中,对应于FHS 2.1中的the /opt说明书。

    注意:GCC 3.0将推出新的更稳定的ABI。当GCC 3.0为大部分Linux所支持时,希望将此说明书升级,将其包括其中。

    ncurses

    建议今后使用ncurses 5进行软件的开发。但还现存一些链接到ncurses 4.2的应用程序,要使其在ncurses 5下工作还需作一些小的改动。这些应用程序使用共享库版本,在安装了ncurses 4.2共享库时应该可以正常运行,例如/lib/libncurses.so.4.2,分别来自libncurses.so.5.0或ncurses 5的其他共享库。

    安全

    无论X11库组还是ncurses库组在setuid应用程序里都不是完全安全的。

    内核

    一些零售商在2.2内核中扩展了某些2.4的性能。使用这些扩展,可能使应用程序依附于某个零售商的内核或2.4版本。因此,第三方开发商最好不要使用这些性能,除非实在需要。

    下面所列的是一些零售商发行的软件中发现的性能,这些都不是标准性能:

    支持32位平台上的64位文件格式
    支持取送自用户空间(kiobufs)的DMA
    PCMCIA 服务
    支持USB设备
    iBCS(SCO, Unixware 模拟)
    AGP GART 管理 API
    扩展 RAID API(raid 0.90)
    如下标准内核性能是2.2.14之后版本中添加的,因而不应应用于便携式程序:

    X.25 插口 API MSG_EOR标记
    电话API扩展(PHONE_RING_STAR占用一个CID、PHONE_QUERY_CODEC、 PHONE_PSTN_LINETEST、PHONE_VAD)
    若在2GB长字符上添加一个矢量,执行readv/writev操作
    上述建议(避免使用非标准内核性能)也有例外,那就是对于安全敏感的应用程序,和出于安全考虑需要添加2.2.14之后某一标准内核性能的应用程序。任何此类需要必须记录下来,并在程序编码中添加一个安全环境,以提供可携带性。如果没有安全环境,程序将不能运行。以下列出的是与安全相关的性能:参见AF_UNIX 插口相关内容

    外壳脚本

    用/bin/sh作为所有外壳脚本的绝对路径。开发人员不妨使用下列外壳测试一下外壳脚本,看看是否能正常运行,大部分版本中用这些外壳作为/bin/sh:

    bash 版本 1.14.7
    bash 版本 2.0x(x >= 3)

    由于在某些小的方面bash 1.14.7与POSIX不一致,建议只使用POSIX 说明书里提供的功能,而不使用bash的专门性能。

    为提供最高级别的可携带性,还需用pdksh或ash作为/bin/sh来测试这些应用程序,因为它们有时会作为/bin/sh应用于较小的或嵌入的系统中。

    为了在Linux发行间扩大可携带性,在外壳脚本中应使用一组保守的小命令。同样我们建议对每个可行的命令使用标准POSIX.2选项。

    FHS 2.1
    应用程序应遵循文件系统层次标准版本2.1(Filesystem Hierarchy Standard),位于http://www.pathname.com/fhs/

    RPM文件包管理程序 (RPM Package Manager)
    如果应用程序以RPM格式分配,建议使用RPM 版本3的文件包,而不要用版本4。

    应用程序兼容性测试
    建议完整的应用程序应至少用本文档中列出的两个不同发行样本进行测试。


    --------------------------------------------------------------------------------

    附录:满足本说明书的发行样本

    Caldera OpenLinux 2.4
    Conectiva Linux 5.1 Linux-Mandrake 7.0
    Red Hat Linux 6.2
    SuSE Linux 6.4
    TurboLinux 6.0
    Debian GNU/Linux 2.2
    Corel Linux OS Second Edition
    注意:以上列出的并不是满足本说明书的全部发行样本。该列表主要是考虑到在撰写本文档及其后稿件时,它们能从发行的光盘中获得。


    --------------------------------------------------------------------------------

    附录:经常提及的问题(FAQ)

    用最新最好的工具及用老版本的工具来创建应用程序有什么区别和联系?
    如果您用较老的一套工具(或者版本比较老的工具)来创建程序,那么可以接受这个程序的人会更多一些。因为较新版本的Linux能够支持在旧版本Linux上开发的程序,但反之却不行。在新版本Linux上创建的程序有可能不能在旧版本中运行。

    例如,假设有三个Linux版本,A、B、C,其中A是最老的,C是最近的。既然在推出新版本时,并不是每个人都选择升级版本,在某个时候安装版本的分布可能为25% A,50% B,和25% C。如果您用版本C创建程序,那么可能只有25%的平台上可以运行这个程序。而如果用版本B,那么就可以在75%的平台上运行。

    但是,答案并不就如此简单。因为Linux是在不断成熟中的,有很多性能和界面只有在最新的版本中才能获得。如果您的程序需要用到这些性能和界面,就必须在新版本的平台中。您必须先在较少的客户基础上容忍片刻,等待更多的人升级到新版本。

    为什么不直接指定一个POSIX外壳?
    这个问题的答案是因为,一个脚本能在某一特定的\"POSIX一致性外壳\"中运行,并不能保证它在任何地方都能运行。要知道,本文档是针对程序作者写的,而不是针对发行的。因此,用多个外壳进行测试对于外壳脚本作者来说,是一个很好的可携带性技巧。

    使用glibc 2.2会出现什么危险?
    与glibc 2.2 链接的应用程序不太可能在基于glibc 2.1的系统中运行。

    另一方面,如果程序开发人员用glibc 2.1系统来创建二进制程序,程序能同时在glibc 2.1和2.2系统中运行的可能性就会大一些。

    Linux内核2.4情况如何?
    在编写本文档时,它还未发行,因此对于内核2.4中关于可携带性问题还没有十分了解。我们希望没有这种问题,但是建议读者还是使用2.2进行软件的开发,除非您的应用程序必需使用2.4。

    发布人:netbull 来自:ChinaByte Linux专区