因为对linux感兴趣,所以一直在学习与之相关的东西。最近下载了APUE2,想学习一下。但是在运行作者随书
的源代码时,总是出错。最后几经周折,也在网上查了好多网友写的资料。终于有了点眉目,和大家分享一下!希望对后来者有帮助
首先,我下载的源码是APUE2的,也就是第二版的源码。至于和第一版到底有多少区别,我也不太清楚
在网上查找资料的时候,某些网友文章中的文件都对不上,可能就是版本的原因
如果你的源码中有类似这样的文件
[root@oracle apue]# ls
advio environ lib.svr4 Make.def.svr4 printer Sourcefiles
call file lock mycat proc stdio
calld ipc Make.def.44 open pty streams
datafiles lib.44 Make.defines opend README termios
db.lock.fine lib.rhlin Make.def.rhlin opend.fe sess test
DISCLAIMER lib.sun Make.def.sun open.fe signals
则这是第一版的,其中这个Make.defines是我从Make.def.svr4 更改文件名后的。
我这里的文件(APUE2)类似于这样:(去掉了fig开头的一些源文件)
[root@oracle apue.2e]# ls |grep -v 'fig*'
advio
call
calld
daemons
db
DISCLAIMER
environ
exercises
include
ipc
ipp
lib
lock
mycat
open
opend
opend.fe
open.fe
proc
pty
README
sess
signals
sockets
std
stdio
streams
systype.sh
termios
threadctl
threads
[root@oracle apue.2e]#
确定了版本,其实编译起来也很容易!首先我们看看README文件,然后再注意几个关键点就可以了!
README文件:
To build the source, edit the Make.defines.* file for your system and set
WKDIR to the pathname of the tree containing the source code. Then just
run "make".
一、(编译源文件)
1、我第一步先检查我os的版本!其实我们自己应该也知道了,例行步骤检查一下吧((*^__^*) 嘻嘻……)
systype.sh 的文件就是这个作用
首先看看当前用户有没有执行权限(为了减少麻烦最好是用root用户)
[root@oracle apue.2e]# ls -l systype.sh
-rwx------ 1 root root 227 Apr 8 17:16 systype.sh
[root@oracle apue.2e]#
如果没有执行权限,则
chmod u+x systype.sh
[root@oracle apue.2e]# ./systype.sh
linux
[root@oracle apue.2e]#
执行后就会显示你目前使用的是什么系统,我用的RHEL as 3,所以显示为linux
2、以我的系统为例,确定了系统为linux后
我此时修改Make.defines.linux文件,主要是修改WKDIR。
我的文件是放在/home/apue.2e 目录下,所以我的WKDIR=/home/apue.2e
你也只需要根据自己的情况修改。
其他的默认就可以了!
3、在/home/apue.2e 目录下,执行make
此时可能出现几个错误:
1.nawk command cannot be found
这个原因是你的系统还不支持nawk(new awk)这个命令
解决:[root@oracle apue.2e]# alias nawk=awk
给awk起一个别名,要系统能够认识nawk这个命令。
2、在编译时可能也会出现其他的错误,但是对库文件的生成并不会有什么影响(有知道原因的可以交流一下)
命令执行之后,在lib/下会产生libapue.a这个库文件。这说明库文件生成已经成功了!
4、这时你会发现,在apue.2e目录下的目录中,都生成了某些*.o的目标文件,
(三)如何编译单独的源文件
通过make命令是直接将所有的源程序编译成可执行文件的。如果需要编译和调试单个程序的话,方法如下:
1.首先还是要用make对所有文件进行编译。成功编译后,会在WKDIR/lib/下生成库文件libapue.a,主要是将apue.h(位于WKDIR/include/)中定义的所有内容生成一个静态的库,这样可以方便调用。
2.我们以WKDIR/下的fig1.3(实现ls部分功能)文件为例说明需要修改的地方。将fig1.3文件重命名为fig1.3.c,然后编辑该文件,将包含头文件的一行代码:
#i nclude "apue.h" //默认所引用头文件的位置为当前的路径WKDIR=/home/apue.2e
修改为
#i nclude "include/apue.h"
即头文件apue.h的位置为当前路径下inlucde文件夹中,这个就正确的指定了apue.h的位置。
这样就可以进行编译了,但在编译的时候还要加上库文件libapue.a,因为该文件实现了apue.h中的所有功能,主要有常用头文件,宏定义以及自定义函数的实现。
输入命令
#gcc fig1.3.c lib/libapue.a
则会生成可执行文件a.out。执行命令
#./a.out /home
则列出我的/home路径下的所有文件和文件夹:
.
..
david
simsun .ttc
simkai.ttf
simsun.ttf
MYKERNEL
当然,如果需要编译的是各个文件夹中的一个源程序时,则只需对所包含的头文件apue.h的路径作相对修改,改为
#i nclude "../include/apue.h"
以及编译是库文件的位置也相应修改,改为:
#gcc sourcefile.c ../lib/libapue.a
至此,APUE第二版作者提供的源码编译方法和单独源码的编译都已经实现。
阅读(1570) | 评论(1) | 转发(0) |