《Linux 公报》……让Linux更富魅力! 


More 2¢ Tips!

译者:Chris Yang


新的提示:

Email问题的回答:


在fvwm2中使用gmenu

Sun, 01 Aug 1999 16:35:00 -0500
From: Tim Moran <tmoran@gbonline.com>

我经常使用fvwm2, 但有时候我想转换到Enlightenment.问题是怎样维护两套菜单. 我现在使用gnome中的菜单编辑器来做到这一点. 

对Enlightenment比较简单:
menu.cfg文件可以读取gnome的菜单

BEGIN_NEW_GNOME_MENU("GNOME_USER_SUBMENU", "ROOT", HOME_DIR"/.gnome/apps")
ADD_MENU_TITLE("User Apps")
END_MENU

对fvwm2则有些技巧.我可能用的不是最好的办法,但满足了我的要求.我重新编译RedHat6.0的WMConfig程序.在WMConfig中有一个以#if HAVE_GNOME开始的段,我把它改为读取我的~/.gnome/apps目录:

ret=parse_gnome_files("/home/tmoran/.gnome/apps", NULL);

然后我写了一段脚本去执行WMConfig并清除不需要的文件:

#!/bin/sh
wmconfig --output=fvwm2 --no-sysdir --rootmenu="ROOTMENU" > .fmenu
find /home/tmoran -name .order -exec rm -f {} \;
find /home/tmoran -name .directory -exec rm -f {} \;

最后我的.fvwm2rc中包含了:

AddToMenu RootMenu 
+ "&Rxvt" Exec exec rxvt
+ "" Nop
Read /home/tmoran/.fmenu
AddToMenu RootMenu 
+ "" Nop
+ "&Fvwm Modules" Popup Module-Popup
+ "" Nop
+ "Refresh Screen" Refresh
+ "" Nop
+ "&Exit Fvwm" Popup Quit-Verify


在IDE和RedHat6.0中使用iomega ATAPI Zip

Tue, 17 Aug 1999 11:15:40 -0700
From: rbsimon <rbsimon@earthlink.net>

有一个简单办法可以mount你的ATAPI Zip驱动器:

  1. 创建一个mount点. e.g. /mnt/zip
  2. 安装可装入核心模块(loadable kernel module) 'insmod ide -scsi'
  3. mount 你的设备 : mount -t msdos /dev/sda4 /mnt/zip
  4. unmount 你的设备 : umount /dev/sda4

一个 2Cent 提示:有趣的签名

Wed, 18 Aug 1999 20:58:49 +0200
From: Csaba Feher <csfeher@freemail.c3.hu>

我决定写一个短小的脚本来做一件有趣的事, 那就是利用"fortune"实现"有趣的签名". 你可以把它用在支持签名的邮件应用程序中。我在Mandrake Linux的Netscape和pine中测试通过.

你需要做的是:

  1. fortuen程序. 我想大部分人在/usr/games下都有这个程序(如果不是在这个目录下,你得修改脚本).如果你没有fortune程序,在你的安装盘上或附近的FTP站点上应该可以找到它.
  2. 和"sh"兼容的Shell.
  3. 脚本文件(我称之为SigChange).
  4. 在你的home diretory下存在.signature文件.(可选)

#!/bin/sh## sigchange#
# 一个让你的签名看起来更有意思的脚本程序
#
# 作者: Csaba Feher (csfeher@freemail.c3.hu)
#

# 首先如果你的.signature文件存在, 我们将删除它,为的是得到一个新的空文件。
if [ -f $HOME/.signature ]; then 
    rm -f $HOME/.signature
fi

# 然后用fortune产生一些有趣的签名
# “-s” 选项是因为Netscape希望签名只有四行。
# 你可以更改下面的两种类型,而我更喜欢它们...
/usr/games/fortune -s linuxcookie computers > $HOME/.signature 
S=$(cat $HOME/.signature)

# 看看你的.signature.basic文件,你可能希望它的内容出现在
# 签名的末尾。按你的喜好修改它,我建议不要太长。
O=$(cat $HOME/.signature.basic)

# 把所有的东西放在签名文件中。
echo -e "$S\n $O" > $HOME/.signature

用法:

1. 修改脚本的权限,让你和你允许的人能够执行它.

2. 把脚本程序拷贝到/bin或/usr/bin或其他目录下.别忘了检查你的PATH环境变量,使它包含到SigChange脚本程序的路径.

3. 把下面的行加入到系统初始化脚本中

SigChange

Mandrake和RedHat的系统初始化脚本是/etc/rc.d/rc.sysinit .其他版本的Linux可能会有所不同.确认后重启系统. .signature文件在每次重启系统后都会有不同的内容.

4. 如果你想.signature内容改变的更频繁一些, 可以把

SigChange

加入到/etc/rc.d中(Mandrake/RedHat).每次在runlevel改变的时候, SigChange都会被触发.

5. 在你的home diretory下创建一个.signature.basic文件,或把你已有的.signature文件改名为.signature.basic. 编辑文件是之含有合适的签名信息,我想你不会让你的签名太长.

你的签名在每次reboot或runlevel改变的时候变化.


HOWTO 文档查找的脚本程序

Wed, 25 Aug 1999 11:56:57 -0400 (EDT)
From: Matt Willis <matt@optimus.cee.cornell.edu>

我发现你用一个脚本很容易查找到HOWTO文档.我受其他一些程序的启发,写了一个半自动的HOWTO文档查找脚本.

用法:howto lilo , 然后脚本就会去查找lilo, Lilo, LILO等关键词(在HOWTO目录下),然后它找到了LILO,如果它没有找到,则会给出提示信息.

- Matt Willis

#!/bin/csh

# HOWTO Database searcher with limited smarts

setenv HOWTOBASE /usr/doc/HOWTO
setenv HOWTOPATH `find $HOWTOBASE -type d -print`
setenv FOUND 0

setenv NAME1 $1
setenv NAMELC `echo $1 | tr 'A-Z' 'a-z'`
setenv NAMEUC `echo $1 | tr 'a-z' 'A-Z'`
setenv NAMEPC `echo $1 | awk '{print toupper(substr($1,1,1)) substr($1,2)}'`

foreach NAME ($NAME1 $NAMELC $NAMEUC $NAMEPC)
    foreach k ($HOWTOPATH)
        if (-f $k/$NAME-HOWTO) then
            echo $k/$NAME-HOWTO
            less -r $k/$NAME-HOWTO
            setenv FOUND 1; break; break
        else if (-f $k/$NAME) then
            echo $k/$NAME
            less -r $k/$NAME
            setenv FOUND 1; break; break
        else if (-f $k/$NAME-HOWTO.gz) then
            echo $k/$NAME-HOWTO.gz
            gunzip -c $k/$NAME-HOWTO.gz | less -r
            setenv FOUND 1; break; break
        else if (-f $k/$NAME.gz) then
            echo $k/$NAME.gz
            gunzip -c $k/$NAME.gz | less -r
            setenv FOUND 1; break; break
        endif
    end
end

if ($FOUND == 0) then
    echo "Was unable to find '$1' .. possible matches:"
    # use case-insensitive name search (iname)
    setenv MATCH `find $HOWTOBASE -iname ''\*$1\*'' -print` 
    if ("$MATCH" == "") then
        echo "Nothing (sorry)!"
    else
        foreach k ($MATCH)
            echo $k | sed 's/^.*\// /'
        end
    endif
endif


下面的部分是回答上期的Mailbag卷的一些问题


答:分解一个大文件

Wed, 04 Aug 1999 13:41:02 +0200
From: Finn Jespersen <fje@ficsgrp.com> Laurent Mulot (Laurent.Mulot@anp.lip6.fr) wrote:

我想分解一个3M的文件,存在软盘上. 该文件已经被压缩了,有没有Linux命令或别的软件可以分解它?

每种Linux版本都和GNU工具一起发行.其中split工具就可以做到这一点.请阅读split的man page或info split.

把一个文件分解成软盘可以容纳的小文件

split -b1440k a_whopping_big_file chunk

将会产生chunkaaa, chunkaab, chunkaac等文件。这些文件都可以容纳在一张软盘上。

要把这些小文件重新合成原来的大文件:

cat chunk* > a_whopping_big_file

Hope this helps.
Finn

Martin Bentlnues <na1374@fen.baynet.de> 建议:

如果源系统和目的系统均为Linux且都有GNU tar的话,则很容易做到这一点。假设软盘为3.5”盘:

将大文件拷贝到软盘:

tar -c -f /dev/fd0 -L1440K -M

从软盘拷贝到目标机:

tar -x -f /dev/fd0 -L1440K -M

tar命令将会在一张软盘被写满的时候提示你插入另一张软盘。

注意事项:
软盘的原有内容在无任何警告信息的情况下被覆盖。软盘没有可用的文件系统,软盘只是作为存储“块”的磁带。如果你还想使用这些软盘的话,就必须在某个操作系统下将这些软盘格式化(DOS,LINUX)。

Best regards,
Martin Benthues

Brian <vocalist@home.com> 的建议:

简单地说,你可以用split命令把一个大文件分解成几个小文件,一旦把这些小文件拷贝到软盘,你就可以携带这些文件。如果你想得到原来的文件,你可以把它们拷贝到目标机的硬盘上,然后用cat命令把小文件合成原来的一个大文件。

详细的例子:我有一个292592byte大小的文件lasg-0-0-0.pdf在我的硬盘上。我想把它分解成小文件并存储到软盘上。我指定小文件的大小为1K(split -c1K).split命令的第二个参数是原文件名,第三参数是输出文件的前缀。前缀后面跟一个不重名的字串,保证你在连接这些小文件时可以得到原来的大文件。我测试了以下命令:

cat lasg-0-0-9.pdf[a-z][a-z]* >tmp.lasg-0-0-9.pdf

得到的文件与原文件一致。

% split -C1k lasg-0-0-9.pdf lasg-0-0-9.pdf%ls -al Total 655
drwxrwxr-x 2 vocalist users 9216 Aug 21 08:53 .
drwxr-xr-x 20 vocalist users 2048 Aug 21 08:50 ..
-rw-rw-r-- 1 vocalist users 0 Aug 21 08:53 data
-rw-rw-r-- 1 vocalist users 292529 Aug 21 08:50 lasg-0-0-9.pdf
-rw-rw-r-- 1 vocalist users 898 Aug 21 08:52 lasg-0-0-9.pdfaa
-rw-rw-r-- 1 vocalist users 738 Aug 21 08:52 lasg-0-0-9.pdfab
-rw-rw-r-- 1 vocalist users 1024 Aug 21 08:52 lasg-0-0-9.pdfac
-rw-rw-r-- 1 vocalist users 1024 Aug 21 08:52 lasg-0-0-9.pdfad
[Lots and lots of lines not shown. -Ed.]
-rw-rw-r-- 1 vocalist users 1020 Aug 21 08:52 lasg-0-0-9.pdfno
-rw-rw-r-- 1 vocalist users 1000 Aug 21 08:52 lasg-0-0-9.pdfnp
-rw-rw-r-- 1 vocalist users 118 Aug 21 08:52 lasg-0-0-9.pdfnq

Jimmy O'Regan <joeregan@tinet.ie> 的建议:

你可以通过键入"man split"或"info split"命令得到更多关于split的信息。在你的例子中你可以这样做:

split -b 1380K your.file your.file

这样你可以把your.file分解成大小为1.38M的小文件,例如your.file.aa, your.file.ab your.file.ac。

你可以重新里连接它们:

cat your.file.aa your.file.ab your.file.ac >yourfile

J.

Remco Schellekens <merty@xs4all.nl> 的建议:

dd 的使用技巧。

用下面的形式使用dd:

dd if=your-input-file of=first-out-file skip=0 count=2840
dd if=your-input-file of=second-out-file skip=2840 count=2840 
dd if=your-input-file of=third-out-file skip=5680 count=2840

等等....

假设块的大小是512个字节,所以2840个块大约是1.4兆。

恢复原文件:

cat first-out-file > your-file
cat second-out-file >> your-file

当然,写一个脚本程序去执行这些命令将会更加简单。

Roland Smith <rsmith@xs4all.nl> 的建议:

Zip你的原文件并用zipsplit命令将压缩后的文件分解成几个可以存入软盘的小文件。


答:格式化驱动器

Tue, 03 Aug 1999 22:43:10 +0100
From: Murray Gibbins <wibble@morpheus.ednet.co.uk>

如果你的LS120对应的设备文件是/dev/hdb, 你可以试试

mksf -t ext2 /dev/hdb

或其他的形式。

Yours
wibble


答:Kodak的问题

Tue, 03 Aug 1999 22:48:24 +0100
From: Murray Gibbins <wibble@morpheus.ednet.co.uk>

使用Perl和ImageMagick,它们使过程自动化,并完成你想做的一切。

Wibble

Zak <zak@acadia.net> 回答到:

我想所有回答我“怎样在gimp中使用subject disk”问题的人们。我的问题是当我把图象拷贝到硬盘(用Mcopy,因为Kodak(c)的图象软盘是DOS文件系统),它们上下翻了个个儿,(后来我发现是左右翻了个个儿),我不知道gimp是怎样工作的,我用的是RedHat5.1。

有一封回信建议我使用“xv”, 我在RedHat5.1的手册中看到它已经被替代了,而我在RedHat5.1的CD中却找到了它。我试了试,可它不仅可以把图象从右向上翻转,而且还能右到左翻转。我遇到一件恰恰相反的事情:两星期之前,我放了另一卷胶卷进去,在处理过程中它要求插入磁盘,当我取出磁盘和照片后,我把磁盘插入机器,运行xv,想把图象翻转过来。

可是它们原来就已经在磁盘上设置好了,我并不需要做任何事情。你们觉得是不是Kodak的人已经读过Linux Gazette了?

Zak 


答:安装的问题

Tue, 10 Aug 1999 17:13:27 +0200
From: Michael Planes <Michael.Planes@bull.net>

Hi,我希望你已经得到答案了,上周我也遇到了同样的问题。我用的是quadri Xeon和1GB RAM。

scsi : 0 hosts
scsi : detected total
partition check
vfs : cannot open device 08:21
kernel panic : vfs : unable to mount root fs on 08:21

多次重启后(我的配置也相应地发生了变化),我发现在boot核心的时候指定一个选项就可以了:

linux mem=128M expert

我在网上发现人们早就发现这个问题且已经解决了(Removing memory, 加启动选项等)。如果RedHat清楚的说明这些问题就好了,我希望是这样。


答:DNS问题

Tue, 10 Aug 1999 17:13:27 +0200
From: Jim Bradley -- Maryville, MO USA <jbradley@msc.net>

我配置了我的laptop并接入公司的网络。在家里,我又把它接入家里的局域网中,并通过另一台专门为拨号设置的机器往外拨号。很不幸,在两次连接公司的DNS Server timeout之后就变成了无限等待。如果我改变DNS Server的顺序,它便通过公司的网去我ISP的DNS Server,但最终还是timeout了。有没有一种简单的方法可以更改DNS Server?我们知道用ifconfig很容易改IP,有没有类似的方法可以改DNS?或者冒险把BIND装到我的laptop上?

如果没有的话我感到很抱歉。我已经在配置文件中做了足够的修改,它们已经自动地工作了。我还没有为找到正确的DNS Server而保存多份拷贝,当然我知道DHCP可以更新它。

我记得的改动是在bootup是产生hostfile, 我的hosts文件中只有localhost和hostname。主要是因为长的hostname可以根据我所接入的网络的不同而变化(甚至可能并没有接入任何网络)。

Ted Wise <twise@jamesmartin.com> 的回答:

你的DNS Server(s)定义在/etc/resolv.conf文件中。如果你使用的是DHCP或PPP,则会被Server自动定义。如果你手工定义,则需要更改这个文件以反映出正确的DNS Server。修改文件对已经运行的程序不起作用(守护进程)。

如果你没有运行DHCP在你的家庭网络,可以试着做一个,那可以减轻你把laptop搬来搬去的痛苦了。

《Linux 公报》编辑回答 Ted Wise:

从什么时候开始Linux PPP可以自动更新DNS Server? Windows可以,我的经验是Linux还不可以。你只有生成多了/etc/resolv.conf文件,并用符号连接指向当前所用的那个。你可以用一个脚本程序去做这些工作并启动pppd。

Ted Wise 的回答:

我已经在使用KDE下的kppp dialer,并且它绝对修改了/etc/resolv.conf文件。当它建立一个连接时就修改了这个文件--注释掉已有的行,然后加入可以适用与当前PPP连接的行。当你退出时,它又恢复原来的文件。

从文件的注释中可以看出, 它跟kppp的特定行为有关系。这就是我的问题所在:我家的Server运行了DNS且masqurade过了PPP Interface,所以/etc/resolv.conf 文件不会随PPP连接而改变。只是我的laptop需要它,我猜想kppp只是pppd的漂亮界面。

[ 结论: pppd 不知道/etc/resolv.conf文件,kppp会写它,DHCP做了些自动化的事情。有何建议? -- 编辑 ]

Ernst-Udo Wallenborn <wall@phys.chem.ethz.ch> 的建议:

我曾用PCMCIA package中的SCHEME机制解决了一个相关的问题:怎样是laptop在两个局域网中有不同的的IP,Domain和DNS Server。

你可以建一个文件/etc/pcmcia/network.ppts包含所有的网络选项。

case "$ADDRESS" in
home,*,*,*)
[snip]
    SEARCH="domain.com"
    DNS_1="1.2.3.4"
    DNS_2=""
    DNS_3=""
[snip]
    ;;
work,*,*,*)
[snip]
    SEARCH="work.com"
    DNS_1="5.6.7.8"
    DNS_2=""
    DNS_3=""
[snip]

然后在启动LILO的时候,你可以指定SCHEME=home或SCHEME=work。最好是把它们写到/etc/lilo.conf文件中,然后在LILO提示符下只要输入home或work就可以了。

整个过程的描述在:

www.suse.de/sdb/en/html/ke_pcmcia-scheme.html

PCMCIA可以从这下载:

hyper.stanford.edu/~dhinds/pcmcia/pcmcia.html

希望有帮助!

--

Ernst-Udo Wallenborn
Laboratorium fuer Physikalische Chemie
ETH Zuerich


答:IPchains

Tue, 10 Aug 1999 15:19:38 -0600
From: Warren Young <tangent@cyberport.com>

Martin L. Ferguson 说到:

我看到你的"$0.02 Tip"的回答,但是没有"script"段的URL,是否可以发给我?我想看看全面的ipchains的配置。

来自《Linux 公报》:

我想你也许漏掉了一些重要的规则,想允许DNS回应的规则。我自己的enable masqurading和firewalling的脚本在下面的URL中,请找"script"段。

其他的URL在的我签名中,但因为Linux Gazette会删掉mail的签名部分,所以你看不见它。(我已经把这封信抄送给了Linux Gazette的编辑,也许他们会改正那个页面)

URL是:http://ww.cyberport.com/~tangent/ix/scripts

我在信中所指的script是指"firewall-enable"和"firewall-disable"。

[ 已加入URL到前一封信中,这个目录下还有一些脚本程序可用于打包整个目录,转换tab符到space符,打印十六进制的文件等等。是的,我的确会删掉mail中的签名 --编辑 ]


答:gcc 出错

Fri, 13 Aug 1999 00:25:55 +0200 (CEST)
From: Roland Smith <rsmith@xs4all.nl>

Hi,我看到了你在Linux Gazette Mailbag的信。我想你没有安装binutils包,它含有让gcc把object文件链接成可执行文件的程序。


答:DHCP

Fri, 13 Aug 1999 00:33:38 +0200 (CEST)
From: Roland Smith <rsmith@xs4all.nl>

关于你“把Linux工作站加入到使用DHCP的网络中”的问题:

你应该有一个miniHOWTO文档(如果你已经安装了是很明智的,/usr/doc/HOWTO/mini/DHCPcd.gz

你需要一个DHCP的客户端程序,查看它是否已经在你所用的Linux版本中,或从ftp.kobe-u.ac.jp站点的/pub/PC-UNIX/Linux/network/DHCP目录取得。

如果你用的是RedHat,你可以用Control Panel设置eth0。


答:PPP连接

Fri, 13 Aug 1999 00:43:42 +0200 (CEST)
From: Roland Smith <rsmith@xs4all.nl>

我有一个有趣的问题。我已经配置过ezppp,kppp和gnome-ppp去连接我在mindspring的帐户,三种程序看上去都工作得很好,但当我打开Netscape或其他Internet应用程序是,我却不能访问Internet。这些程序只是在那儿不停地寻找主机,没有错误信息,没有任何东西,我非常烦恼。谢谢!

- 你需要查看一下这几件事情:

1. 在打开Netscape之前,你是否真的建立了一个连接。如果你想在每次访问Internet的时候都自动拨号的话,则还需要另外的软件。

2. 你是否已把ISP Server的名字加入了/etc/resolv.conf文件中?

3. /etc/resolv.conf是否配置得正确?它应该包含两行:

order host,bind
multi on


答:ASCII码到语音的转化

Fri, 13 Aug 1999 01:34:06 +0200 (CEST)
From: Roland Smith <rsmith@xs4all.nl>

从你在Linux Gazette的信中看不出你在找什么。

你的主题栏中说你在寻找一种ASCII码到语音的转化程序。你可以试试"rsynth"或"festival"(freshmeat.net中可以找到它们的URL)。

Linux语言识别软件是另外一些东西,我想IBM已经发布这种软件。

[Thanks, Roland, for all your answers. -Ed]

Jimmy O'Regan <joeregan@tinet.ie> 的建议:

ASCII到语言的转化和语音识别是完全相反的过程,但你可以在Blinux站点找到大部分与两者相关的软件。http://leb.net/blinux/ or at http://leb.net/pub/blinux


答:Linux中2GB的限制

Thu, 19 Aug 1999 16:08:23 -0700
From: Greg Morse <greg_morse@bctel.com>

如果BIOS不支持大驱动器的话,这个限制不起作用。我最近在我的旧Compaq porlina133上加了个8GB的硬盘。DOS的FDISK可以看但不能使用它。Linux(RedHat6.0)可以在这个硬盘上建立8GB的文件系统。

JGM

Niels Elgaard Larsen <elgaard@diku.dk> 写到:

1. 那与BIOS无关, 你可以指定"geometry"作为FDISK的参数。

2. 别相信硬盘厂商的话,我装了个10GB的硬盘,但盘上的参数和网页上的参数与他们的8GB的产品一样。我想他们依赖某些特别的软件让硬盘在WINDOWS下正常工作。
我假设扇区和头的数量是正确的,而且从总容量计算出了它的柱面的数量,它就可以工作了。


答:LINUX中的WIN98

Sat, 21 Aug 1999 08:39:45 -0400
From: Brian <vocalist@home.com>

如果你访问 www.vmware.com,你就可以看到他们的产品VMware -- 在1999年7月的Linux Journal中介绍过的。你也可以订阅interactive.linuxjournal.com的邮件。

VMware让你在Linux机器上运行不同的虚拟机。详情请见他们的网页。价格是299美元,我很看中它,因为它让我在没有运行WINDOWS的情况下测试WINDOWS下的JAVA。


答:版本问题

Wed, 25 Aug 1999 01:18:59 -0400
From: Steve Wolfe <swolfe@InfoAve.Net>

有些人也许能够更加准确地说出SuSE和RedHat之间的差别。RedHat有更加多的东西。

一个很重要的问题是“你周围的人用的是什么版本的Linux?”

UNIX或LINUX并不是很难学,但和WINDOWS不同。去LINUX的用户组或商店看看就可能知道了。我很喜欢“Life with Linux”这本书,它可以提供你所盼望的基础知识。O'Reilly的书有很高的价值。我还喜欢打印出来的文档,包括“系统管理指南”,“网络管理指南”和HOWTO文档。

我习惯用双引导系统--你可以用LINUX和WINDOWS,当然不是同时。这在一段时间里挺管用,缺点是你无法同时使用它们。最好的顺序是1)分区 2)安装WINDOWS 3)安装LINUX和LILO。

有两台机器的话就更好了,通过一个小型的局域网你可以用TELNET或X-window程序去使用两台机器--我现在就是这样做的。WINDOWS下有很多X-Server程序。 Hummingbird的Exceed,Reflection的X-window套件,和StartNet的X-win32都很好,我多使用过。

我听说有些虚拟机可以让你在同一台机器上同时使用两种操作系统 -- 但我没有试过。

看过文档之后你就知道,你可以在LINUX中MOUNT一个FAT分区,并把它作为两台机器之间传输数据的途径。如果你有两台机器,网络会管理文件的传输。记住,UNIX/LINUX的文本文件只有换行符,而PC-DOS的文本文件则含有换行符和回车符。

-Cheers,
Steve Wolfe


答:WORD文档转化为PostScript文档

Thu, 01 Jul 1999 14:14:54 -0400
From: Reno Derosier <renod@capecod.net>

对于.prn文件,你可以下载Adobe的PostScript驱动程序。

www.adobe.com/prodindex/printerdrivers/main.html.

Reno Derosier


答:g++中包含模板文件

Wed, 4 Aug 1999 00:13:59 -0700 (MST)
From: Rachael A. Ludwick <raludwic@U.Arizona.EDU>

jac <jac@speedcom.es> 写到:

HELLO,我的问题是关于g++编译器。我想知道是否可以链接模板文件,这样不用在主程序中include它们。(“它们”指的是不同的文件,而只是头文件被包含在主程序中)。

我试过:

gcc main.cxx libro.cxx
* main : #include "libro.h"
* libro.cxx : #include "libro.h"

但RedHat的编译器却报错,能帮忙吗? 谢谢!

Juan J.Alejandro (jac@speedcom.es) Girona (Spain)


我不知道能不能帮忙, 请看下面...

C++中一个另人讨厌的事情就是模板类需要把定义和实现放在同一个文件中。如果不能放在同一个文件中,则经常使用的解决办法是在模板类的头文件的末尾加入"#include class.cc",以包含模板类的实现文件。模板类的实现文件名常常为class.template,那就把"#include class.template" 加到头文件的末尾(类定义之后)。

而且,别忘了要防止你的头文件被重复包含,可以在头文件的头部加入

#ifndef MYCLASS_H
#define MYCLASS_H

在末尾加入:

#endif // MYCLASS_H

不过怎么说,如果你的实现和定义是在不同的文件中,而你又没有上述的一些行,则将会导致一些问题。假如上面所说的解决了你的问题,你有了main.cc文件,模板文件"class.h" 和"class.cc",你就可以这样编译:

g++ -I. main.cc (当然,假定main.cc包含了“class.h”)

告诉我这些是否对你的问题有效.....

Rachael Ludwick


版权所有 © 1999 NJLUG
出版于第45期《Linux公报》1999年9月 中文版第十一期

[ TABLE OF CONTENTS ] [ FRONT PAGE ] Back Next