《UNIX环境高级编程》 —— 书中实例编译、运行

想认真学习《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);
}

cc myls.c

这样固然可以编译,但每次写一个实例都要把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

这样,我们编译就变得轻松多了,直接make。

结果:

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


你可能感兴趣的:(编程,unix,实例,makefile)