APUE源码的下载:http://www.apuebook.com/src.tar.gz
1.编译源码
假设源码解压到/home/crazyboy/tmp/apue.2e.src目录下.
首先修改与自己系统对应的Make.defines.*文件,我的是linux系统,就修改Make.defines.linux文件,将里面的WKDIR修改成源码所在的目录,即这一行改成"WKDIR=/home/crazyboy/tmp/apue.2e.src".然后make或者make linux.
如果make的时候报"ARG_MAX"未定义错误,那么修改include目录下的apue.h文件,添加一行:#define ARG_MAX 4096
然后修改threadctl/getenv1.c和threadctl/getenv3.c这两个文件,添加#include "apue.h".然后再make
2.使用apue.h和libapue.a
源码的README中只说明如何编译,如果要编译自己敲的代码的话,需要将include/apue.h拷贝到/usr/include目录下,再将lib/libapue.a拷贝到/usr/lib/或者/usr/lib64/目录下.然后就可以在自己敲的代码中使用#include
gcc hello.c -lapue -o hello
确保你已经安装了gcc和gawk。
步骤
1.到www.apuebook.com下载源码
2.tar解包,cd apue.2e
3.vi Make.defines.linux 修改变量WKDIR,指向你的apue源码的位置,我的是/home/huangz/code/apue.2e,所以
WKDIR=/home/huangz/code/apue.2e
4.vi include/apue.h 增加一个常量ARG_MAX,这是threadctl/getenv1.c和threadctl/getenv3.c要用到的;4096这个值是参考里给的,如果有问题,自己修改吧。
#define ARG_MAX 4096
5.vi threadctl/getenv1.c 增加
#include "apue.h"
6.vi threadctl/getenv3.c 增加
#include "apue.h"
7.vi threads/badexit2.c 修改第31行,将pthread_self()的返回值转换为int类型。
printf("thread 2: ID is %d\n", (int)pthread_self());
8.vi std/linux.mk 将两个nawk改为gawk
9.make
10.sudo cp include/apue.h /usr/include
sudo cp lib/libapue.a /usr/lib
好了,测试一下,记得要用-lapue命令让编译器链接apue库
gcc main.c -lapue
《UNIX 环境高级编程》每个历程中,都会有这样一行:
#include "apue.h"
这个头文件是作者把把每个例程中常用的标准头文件,一些常用的出错处理函数(err_**()之类的函数)和一些常用的宏定义给整理在一个头文件中。这个可以省去在每个例程中录入较多的重复代码,这样可以减少每个例程的长度。给读者带来了不少麻烦。下面给出一种代码的编译方法。
4、拷贝apue2e_src/apue.2e/include/apue.h和apue2e_src/apue.2e/lib/libapue.a
到你的代码目录。
5、使用gcc -o hello hello.c libapue.a来编译你的代码
——————————————————————————————
照着做,然后make一下,最后报错,大概原因是找不到nawk命令。貌似linux下没有这命令。查到这命令出现在apue.2e/std/linux.mk文件中,试着把nawk换成gawk,再make clean一下,重新make,编译通过了。
我使用下面命令编译源程序:
gcc -o myls ls1.c -I../include ../lib/libapue.a
——————————————————————————————
gawk命令:
gawk ( GNU awk )工具是一种模式扫描和处理语言,它搜索一个或多个文件,以查看这些文件中是否存在匹配指定模式的记录(通常是文本)。每次发现时,它通过执行动作的方式处理文本。使用 gawk 可以生成报告或者过滤文本, gawk 的很多结构来自 C 语言。
Gawk 工具是 UNIX awk 的 GNU 版。为了方便起见,很多 linux 系统将 /bin/awk 链接到/bin/gawk ,这样用户可以使用两者中的任何一个来运行程序。
/////////////////////////////////////////////////////////////////////////////////////////////////////////
1.在第二个步骤中要apue.2e中修改Make.defines.linux,但一开始找不到这个文件。原因很简单:找错代码了...重下个。
2.第四个步骤中拷贝 /apue.2e/include/apue.h和/apue.2e/lib/libapue.a到你的代码目录。就可以解决找不到源函数的问题。其中/apue.2e下的一大堆fig*就是书中的示例代码。fig1.3是第一个源码。
3.在执行#gcc -o test1 fig1.3 libapue.a 编译时会出现File format not recognized:文件类型显示不正确的错误。只要修改fig1.3名字就OK。
执行命令:#cp fig1.3 sample13.c
#gcc -o test1 sample13.c libapue.a 就编译成功了!