【轻知识】阅读apue(《UNIX环境高级编程》)入门,Makefile文件编写

中文 第三版

入门

阅读,能看懂。但是代码不敲一下。感觉缺点什么。

比如以第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/

你可能感兴趣的:(【轻知识】阅读apue(《UNIX环境高级编程》)入门,Makefile文件编写)