- 论坛徽章:
- 0
|
哎呀,经过一番努力,Advanced
Programming in the Unix Environment 1[color="#000000"]st
Edition的代码我终于知道是怎么跑的了.
首先在作者的网站www.kohala.com/start上面下载apue.linux3.tar.Z源代码包,之后再Linux中用命令[color="#000000"]"tar
xzvf apue.linux3.tar.Z[color="#000000"]"解压缩成文件夹apue即可.
[color="#000000"]"cd[color="#000000"]"进入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文件夹的位置,这个[color="#000000"]"libmisc.a[color="#000000"]"文件就是我们编译之后所生成的库文件.
最后阅读README文件.此文件中完整的描述了如何[color="#000000"]"make[color="#000000"]"出来[color="#000000"]"libmisc.a[color="#000000"]"文件.首先通过作者的介绍明白了用":set
tabstop=4"命令可以把vi中tab的距离设置成4个字符.先通读一遍[color="#000000"]"PART
ONE by W. Richard
Stevens[color="#000000"]",大致了解一下这些文件在正常的Unix系统上应该如何编译.因为本书第一版的年代比较久远了,所以这个第一部分了解一下即可,让我们知道大致流程是什么,重点是看第二部分.
README文件的第二部分[color="#000000"]"PART
TWO - Linux Redhat 6.0 specific[color="#000000"]",这个经过测试在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.
[color="#800000"] [color="#800000"]也就是上面我说的把[color="#800000"]"LDLIBS=/home/thanlon/apue/libmisc.a #th"[color="#800000"]和"LIB =
/home/thanlon/apue/libmisc.a #th"[color="#800000"]替换成自己放置[color="#800000"]apue[color="#800000"]文件夹的位置[color="#800000"],[color="#800000"]这个[color="#000000"]"[color="#800000"]libmisc.a[color="#000000"]"[color="#800000"]文件就是我们编译之后所生成的库文件[color="#800000"].
Copy
Make.def.rhlin to the new file Make.defines (in the apue directory at
the shell do %cp Make.def.rhlin Make.defines).
[color="#800000"] 也就是把"Make.def.rhlin
[color="#000000"]"这个文件copy成一个叫做[color="#000000"]"Make.defines[color="#000000"]"的文件,直接敲作者给的命令就可以了.
Switch
to the apue/lib.rhlin directory.
[color="#800000"] 之后"cd[color="#000000"]"到[color="#000000"]"apue/lib.rhlin[color="#000000"]"这个文件夹.
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.
[color="#800000"] 先看一眼"systype.sh[color="#000000"]"这个文件,一般不会有什么问题,之后直接在当前目录下面[color="#000000"]"make[color="#000000"]"命令即可,不过像作者介绍的[color="#000000"]"make
> op 2> eop[color="#000000"]"可也以.[color="#000000"]"make[color="#000000"]"之后不出意外便以正确的话,系统直接打印新的命令提示符了.
That
is it if you are using rh6.0 or on an intel machine.
[color="#800000"] 到了这一步[color="#000000"]"libmisc.a"[color="#000000"]这个文件就算编译好了[color="#000000"].
[color="#800000"] [color="#000000"]下一步就是运行代码了[color="#000000"].[color="#000000"]有些文件比如Program
1.4 [color="#000000"]的"Print
the process ID.",[color="#000000"]直接用命令"gcc
hello.c -o hello"[color="#000000"]即可编译出[color="#000000"]hello[color="#000000"]文件[color="#000000"],[color="#000000"]并可直接用命令[color="#000000"]"./hello"[color="#000000"]来运行[color="#000000"].[color="#000000"]但有的文件比如Program
1.2 [color="#000000"]的"Copy
standard input to standard output."[color="#000000"]程序[color="#000000"].[color="#000000"]直接用"gcc
mycat.c -o mycat"[color="#000000"]命令来编译就会出现[color="#000000"]" /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[color="#000000"]"[color="#000000"]的提示[color="#000000"].[color="#000000"]这个具体原因可能是因为作者另外自己编写的"Standard
Error Routines"[color="#000000"]文件没有包含进去[color="#000000"].
我们可以通过回到apue/lib.rhlin文件夹下面,拷贝出"error.o"文件至我们所需要编译的文件的文件夹,比如"cp
error.o
../mycat/"下面即可.之后在编译的时候我们可以编写Makefile文件来直接用make命令编译,也可以通过命令" $gcc
-c mycat.c
$gcc
mycat.o error.o -o mycat
$./mycat"
[color="#000000"]来运行[color="#000000"].[color="#000000"]这样我们就可以很好的使用Advanced
Programming in the Unix Environment 1[color="#000000"]st
Edition[color="#000000"]的随书源代码了[color="#000000"].
[color="#000000"]
[color="#000000"] 经测试,此源代码可以通过putty.exe使用SSH协议登陆,在Windows
XP Professional Edition SP3下的VMware
Workstation 6.5.1 build-126130内安装的Redhat
Enterprise Linux 5.1和Ubuntu
9.10下通过测试.
最后想说的就是,任何东西,只要认真看了,好像都能看懂...最少弄不懂原理但是能明白怎么弄...以后还是不要浮躁,沉下心来好好研究研究这些东西吧!
[color="#000000"]为考T努力!为熟悉的在Linux环境下用C编程努力!
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104863/showart_2089107.html |
|