gcc && makefile (little tip

gcc

经典的编译器,没啥好说,就列一下常用参数

源文件:hello.c
预处理: gcc -E hello.c -o hello.i
汇编: gcc -S hello.i -o hello.S
编译: gcc -c hello.S -o hello.o
链接: gcc hello.o -o hello

众所周知:工具的创造是为了解放劳动力,那你们说做汇编作业的时候用 c 写好然后 gcc - S 一下岂不是美滋滋(手动滑稽

makefile

切入正题!
贴代码:

#源文件:server_my.c client_my.c wrap.c
CC = gcc
src = $(wildcard *.c)
obj = $(patsubst %.c, %.o, $(src))

all:server_my client_my

server_my:server_my.o wrap.o
    $(CC) $^ -o $@ -Wall

client_my:client_my.o wrap.o
    $(CC) $^ -o $@ -Wall

%.o:%.c
    $(CC) -c $< -o $@ -Wall

.PHONY:
clean:
    rm -rf server_my client_my $(obj)

正如大司所说:你看不懂,那是你只看到了第一层,而我,看到了第五层(手动滑稽

首先

  • makefile 文件名叫 makefile
  • #是注释

第一层

 target... : prerequisites ...
 [TAB]command

target 为目标文件,prerequisites 为依赖文件
可能会有多个这样的指令,从上往下查找,比如:
源文件:hello.c

hello:hello.o
    gcc hello.o -o hello
hello.o:hello.S
    gcc -c hello.S -o hello.o
hello.S:hello.i
    gcc -S hello.i -o hello.S
hello.i:hello.c
    gcc -E hello.c -o hello.i

.PHONY:clean
clean:
    -rm -rf hello.o hello.S hello.i hello

要获得 hello 需要 hello.o,要获得 hello.o 需要 hello.S,要获得 hello.S 需要 hello.i,要获得 hello.i 需要 hello.c, 从上往下找。
而后面.PHONY表示,clean 是个伪目标文件。常见的make clean指令就是依据这里的命令来运作的;而在 rm 命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。
( 若要编译多个目标文件怎么办呢? 这时候可以这样all:target1 target2 ...,如第一个 makefile 所写)

第二层:变量

=替换, +=追加,:=恒等于
如第一个 makefile 中CC=gcc即把 CC 变量设为 gcc,通过 $(CC)来使用变量

第三层:隐含规则

%.c %.o 意为任意的.c 任意的.o  
*.c *.o 意为所有的.c 所有的.o

具体应用请看第一个 makefile,hiahiahia

第四层:通配符

这里列出三个常用的
$@-- 目标文件,$^-- 所有的依赖文件,$<-- 第一个依赖文件。

第五层:函数

上面的 makefile 开头就用到了函数(我也只知道这两个,够用就溜 hhh

src = $(wildcard *.c)
obj = $(patsubst %.c, %.o, $(src))

第一个函数意为将当前目录下所有 *.c 赋值给变量 src
第二个函数意为将 src 任何一个.c 都变成.o 然后赋值给 obj

然后 看不看得懂就看你的造化了
bingo~~