中文 第三版
入门
阅读,能看懂。但是代码不敲一下。感觉缺点什么。
比如以第10页的 出错处理
代码为例。
#include "apue.h"
#include
#include
int main(int argc, char *argv[]) {
fprintf(stderr, "EACCSS: %s\n", strerror(EACCES));
errno = ENOENT;
perror(argv[0]);
return 0;
}
apue.h 是书中代码包里面的一个头文件。你不下载。你可以#include
。我是为了保持一致就down了一份。照着源码的目录放了。自己练习保持一致。
../apue
├── include
│ └── apue.h
└── intro
├── Makefile
└── testerror.c
像我这对gcc参数都不大知晓的。上来直接对 testerror.c 。gcc testerror.c -o testerror
就报错了。
➜ intro gcc testerror.c -o testerror
testerror.c:1:10: fatal error: 'apue.h' file not found
#include "apue.h"
^~~~~~~~
1 error generated.
其实找不到头文件。那需要指定目录。改成:
gcc testerror.c -I../include -o testerror
makefile 的编写
每次都要敲这么长的命令。多麻烦。
testerror:testerror.o
gcc testerror.o -o testerror
testerror.o:testerror.c
gcc testerror.c -I../include -c -Wall -g -o testerror.o
clean:
rm *.o testerror
精简
OBJS=testerror.o
CC=gcc
CFLAGS+=-I../include -c -Wall -g
testerror:$(OBJS)
$(CC) $(OBJS) -o testerror
testerror.o:testerror.c
$(CC) testerror.c $(CFLAGS) -o testerror.o
clean:
$(RM) *.o testerror
再精简
OBJS=testerror.o
CC=gcc
CFLAGS+= -I../include -c -Wall -g
testerror:$(OBJS)
$(CC) $^ -o $@
testerror.o:testerror.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o testerror
精简
OBJS=testerror.o
CC=gcc
CFLAGS+=-I../include -c -Wall -g
testerror:$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o testerror
如果看不懂。请看下参考资料。
再看下书中源码包的intro目录。目录下也有一个makefile文件。人家的源码文件可以生成多个。然后参考这个makefile文件。我们改造下自己的。
ROOT=..
CC=gcc
CFLAGS+= -I$(ROOT)/include -c -Wall -g
PROGS = testerror
all: $(PROGS)
$(PROGS):%:%.o
$(CC) $^ -o $@
%.o:%.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) $(PROGS) *.o
上面的Makefile文件。都是先生成目标文件.o文件。然后再链接。其实Makefile可以简化成。
ROOT=..
CC=gcc
CFLAGS+= -I$(ROOT)/include
PROGS = testerror
all: $(PROGS)
%:%.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) $(PROGS) *.o
如上,看起来跟apue源码包intro目录下的Makefile 有点相似了。
ok,再练习另一个程序(1.8小节:用户标识)。
#include "apue.h"
int main(void)
{
printf("uid = %d, gid = %d\n", getuid(), getgid());
return 0;
}
我们只需要把uidgid 放到Makefile文件里面。
ROOT=..
CC=gcc
CFLAGS+= -I$(ROOT)/include
PROGS = testerror uidgid
all: $(PROGS)
%:%.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) $(PROGS) *.o
make 一下就编译出来了uidgid。
参考资料:
- 《如何编写makefile》https://www.bilibili.com/video/av97776979/