想认真学习《UNIX环境高级编程》的人士可能都想把书中的实例给敲一遍,运行看一下效果。但对于新手来说,可能会有一定的困难,因为例子中用到的头文件和一些函数不知道在哪里,编译可能也会出问题。这边文章就是以一个实例来介绍如何运行这本书中的实例。
首先,需要头文件apue.h,这个头文件在另一篇博文里有:http://blog.csdn.net/wangyuling1234567890/article/details/20491159
但这样还不行,如果直接编译会有如提示找不到err_***函数的定义,这是因为例子里用的错误处理函数在apue.h中有声明,却定义在另一个文件中,
请参考myerr.h:http://blog.csdn.net/wangyuling1234567890/article/details/20492319
把apue.h和myerr.h这两个文件都准备好了,接下来就可以敲代码、编译执行了。
如书中第一个例子:
myls.c
#include "apue.h"
#include "myerr.h" //这个头文件需要自己加进去
#include <dirent.h>
int main(int argc, char * argv[])
{
DIR * dp;
struct dirent *dirp;
if (2 != argc)
{
err_quit("usage: ls directory_name");
}
if ( NULL == (dp = opendir(argv[1])))
{
err_sys("can't open %s", argv[1]);
}
while (NULL != (dirp = readdir(dp)))
{
printf("%s\n", dirp->d_name);
}
close(dp);
exit(0);
}
这样固然可以编译,但每次写一个实例都要把apue.h和myerr.h两个文件拷贝到当前目录里,这样做是很不好的一个习惯,也不合理。
一个解决方法就是把这两个公共文件放到一个目录里(如:../include ),编译的时候指定头文件目录就可以了。
cc -I../include myls.c
文件结构:
linux:/mnt/hgfs/vmware-share/unix # tree -a
.
|-- chapter-1
| |-- makefile
| `-- myls.c
`-- include
|-- apue.h
`-- myerr.h
但这样又有一个新问题,就是每次编译需要键盘敲的字母变得多了,耽误时间。特别是当编译选项比较多,文件也比较多时,这样做就变得基本不可能了。这时,我们自然而然就会想到makefile。下面就是针对这个例子编写的makefile:
CC = gcc ROOT := $(shell pwd)/.. INCLUDE := $(ROOT)/include CFLAGS += -I$(INCLUDE) default:my_ls my_ls:myls.o $(CC) -o my_ls myls.o myls.o:myls.c $(CC) $(CFLAGS) -c myls.c clean: -rm *.o my_ls
结果:
linux:/mnt/hgfs/vmware-share/unix/chapter-1 # ll drwxrwxrwx 1 root root 4096 2014-04-02 22:56 . drwxrwxrwx 1 root root 0 2014-04-02 22:18 .. -rwxrwxrwx 1 root root 220 2014-04-02 22:24 makefile -rwxrwxrwx 1 root root 8892 2014-04-02 22:56 my_ls -rwxrwxrwx 1 root root 402 2014-04-02 22:07 myls.c -rwxrwxrwx 1 root root 2132 2014-04-02 22:56 myls.o linux:/mnt/hgfs/vmware-share/unix/chapter-1 # ./my_ls usage: ls directory_name linux:/mnt/hgfs/vmware-share/unix/chapter-1 # ./my_ls /mnt/hgfs/vmware-share/unix/ . .. chapter-1 include linux:/mnt/hgfs/vmware-share/unix/chapter-1 # ./my_ls /mnt/hgfs/vmware-share/unix/chapter-1/ . .. makefile myls.c myls.o my_ls linux:/mnt/hgfs/vmware-share/unix/chapter-1 #
关于makefile更详细的介绍请参考:http://blog.csdn.net/wangyuling1234567890/article/category/2163845