Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16869
  • 博文数量: 7
  • 博客积分: 1563
  • 博客等级: 上尉
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-19 16:22
文章分类

全部博文(7)

文章存档

2011年(1)

2010年(1)

2009年(5)

我的朋友
最近访客

分类: LINUX

2009-11-07 22:33:43

哎呀,经过一番努力,Advanced Programming in the Unix Environment 1st Edition的代码我终于知道是怎么跑的了.


首先在作者的网站上面下载apue.linux3.tar.Z源代码包,之后再Linux中用命令"tar xzvf apue.linux3.tar.Z"解压缩成文件夹apue即可.


"cd"进入apue目录,阅读DISCLAIMER,Make.def.rhlin,Sourcefiles,README等几个文件. 其中DISCLAIMER文件中的内容可以不做阅读,我也没细看...

Sourcefiles文件中的内容是源代码的组织结构,和书中的代码编号是一一对应的.比如Sourcefiles文件中的"1.1 file/ls1.c"就对应着书中正文第4页的"Program 1.1 List all the files in a directory."以后可以按照Sourcefiles文件中的顺序来对应书中的代码.

之后修改Make.def.rhlin文件,将其中的"LDLIBS=/home/thanlon/apue/libmisc.a #th""LIB = /home/thanlon/apue/libmisc.a #th"替换成自己放置apue文件夹的位置,这个"libmisc.a"文件就是我们编译之后所生成的库文件.

最后阅读README文件.此文件中完整的描述了如何"make"出来"libmisc.a"文件.首先通过作者的介绍明白了用":set tabstop=4"命令可以把vitab的距离设置成4个字符.先通读一遍"PART ONE by W. Richard Stevens",大致了解一下这些文件在正常的Unix系统上应该如何编译.因为本书第一版的年代比较久远了,所以这个第一部分了解一下即可,让我们知道大致流程是什么,重点是看第二部分.

README文件的第二部分"PART TWO - Linux Redhat 6.0 specific",这个经过测试在RHEL 5.1下可以编译通过.步骤如下:

Read PART ONE.

Edit /apue/Make.def.rhlin so it contains the proper directories to store your library in after it is compiled.

也就是上面我说的把"LDLIBS=/home/thanlon/apue/libmisc.a #th""LIB = /home/thanlon/apue/libmisc.a #th"替换成自己放置apue文件夹的位置,这个"libmisc.a"文件就是我们编译之后所生成的库文件.

Copy Make.def.rhlin to the new file Make.defines (in the apue directory at the shell do %cp Make.def.rhlin Make.defines).

也就是把"Make.def.rhlin "这个文件copy成一个叫做"Make.defines"的文件,直接敲作者给的命令就可以了.

Switch to the apue/lib.rhlin directory.

之后"cd""apue/lib.rhlin"这个文件夹.

At the shell execute the command "make". I usually do a "make > op 2> eop" so that standard output is stored in the new file op and standard error is in new file eop. That way if you have problems you have a file to print as documentation to show to your expert.

先看一眼"systype.sh"这个文件,一般不会有什么问题,之后直接在当前目录下面"make"命令即可,不过像作者介绍的"make > op 2> eop"可也以."make"之后不出意外便以正确的话,系统直接打印新的命令提示符了.

That is it if you are using rh6.0 or on an intel machine.

到了这一步"libmisc.a"这个文件就算编译好了.


下一步就是运行代码了.有些文件比如Program 1.4 "Print the process ID.",直接用命令"gcc hello.c -o hello"即可编译出hello文件,并可直接用命令"./hello"来运行.但有的文件比如Program 1.2 "Copy standard input to standard output."程序.直接用"gcc mycat.c -o mycat"命令来编译就会出现" /tmp/cc27IEoZ.o: In function `main':

mycat.c:(.text+0x40): undefined reference to `err_sys'

mycat.c:(.text+0x79): undefined reference to `err_sys'

collect2: ld returned 1 exit status"的提示.这个具体原因可能是因为作者另外自己编写的"Standard Error Routines"文件没有包含进去.

我们可以通过回到apue/lib.rhlin文件夹下面,拷贝出"error.o"文件至我们所需要编译的文件的文件夹,比如"cp error.o ../mycat/"下面即可.之后在编译的时候我们可以编写Makefile文件来直接用make命令编译,也可以通过命令" $gcc -c mycat.c

$gcc mycat.o error.o -o mycat

$./mycat" 来运行.这样我们就可以很好的使用Advanced Programming in the Unix Environment 1st Edition的随书源代码了.

经测试,此源代码可以通过putty.exe使用SSH协议登陆,Windows XP Professional Edition SP3下的VMware Workstation 6.5.1 build-126130内安装的Redhat Enterprise Linux 5.1Ubuntu 9.10下通过测试.


最后想说的就是,任何东西,只要认真看了,好像都能看懂...最少弄不懂原理但是能明白怎么弄...以后还是不要浮躁,沉下心来好好研究研究这些东西吧!

为考T努力!为熟悉的在Linux环境下用C编程努力!

阅读(699) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~