APUE中有很多实例,比如第4页中图1-3中描述了一个简单的类似ls命令的c程序。几乎所有例子都会引用一个apue.h头文件。这个头文件是作者自己实现的,起到屏蔽平台相关实现的作用。直接编译图1-3中的程序是没法通过的,因为缺少apue.h这个头文件。
那该怎么编译这个实例呢?需要做下面几件事情:
- 到书的主页去下载源代码,主页地址为http://www.apuebook.com/。我看的书是第三版,所以下载到的压缩包名称是src.3e.tar.gz,解压后得到apue.3e文件夹。
- 编译源代码。只需要在apue.3e目录下运行make就可以完成编译。不过我编译是遇到缺少-lbsd的错误,需要运行sudo apt-get install libbsd-dev来安装libbsd-dev,然后编译就能正常结束了。编译完成后,在apue.3e/lib下会产生libapue.a,这个是书中实例所需要的lib文件。
- 把apue.3e转移到合适的位置,比如/usr/local/lib,这只是个人习惯。
- 编译书中的实例,例如gcc myls.c /usr/local/lib/apue.3e/lib/libapue.a -I /usr/local/lib/apue.3e/include,应该就能正常编译了。
意识到也该是时候学习Makefile的写法了,于是参考http://stackoverflow.com/questions/73799/how-did-you-learn-the-gnu-make-tools写了一个Makefile,这样只需要执行make就能完成编译了。Makefile文件内容如下(相信并非最优的写法):
#变量定义,变量的引用以$(variable)的形式
ROOT=/usr/local/lib/apue.3e
CC=gcc
CFLAGS=-Wall
LIBAPUE=$(ROOT)/lib/libapue.a
INCLUDE=$(ROOT)/include
all:myls.o
$(CC) myls.o $(LIBAPUE) -o myls
#-c表示只编译不链接,如果不加会报错,因为err_quit和err_sys需要到对于的lib文件里找
myls.o:myls.c
$(CC) -c myls.c -I $(INCLUDE)
clean:
rm -rf *.o myls *.out
运行生成的可执行文件,得到如下输出: