gcc选项

(1)-c编译生成.o文件

gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c

(2)-o编译生成可执行文件

gcc -o main main.o mytool1.o mytool2.o

(3)执行make, 使用makefile文件组织编译

main:main.o mytool1.o mytool2.o  #表示我们的目标main的依赖对象是main.o mytool1.o mytool2.o 
gcc -o main main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h
gcc -c main.c

mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c

根据Makefile的缺省规则,简化Makefile

main:main.o mytool1.o mytool2.o
gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h
gcc -c $<

mytool1.o:mytool1.c mytool1.h
gcc -c $<

mytool2.o:mytool2.c mytool2.h
gcc -c $<

Makefile有三个非常有用的变量。分别是 @ , @, @^,$<代表的意义分别是:
$@–目标文件
$^–所有的依赖文件
$<–第一个依赖文件

再次简化Makefile

main:main.o mytool1.o mytool2.o
gcc -o $@ $^

.c.o:               #表示所有的 .o文件都是依赖与相应的.c文件的
gcc -c $<

(4)链接
-lm : 链接 使用:gcc -o temp temp.c -lm
-L : 指定编译路径 ,缺省路径 /lib , /usr/lib 和/usr/local/lib

比如我要找sin这个函数所在的库。 就只好用 nm -o /lib/*.so|grep sin>~/sin 命令,然后看~/sin文件,到那里面去找了。在sin文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在 libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm)。

(5)
.PHONY 后面的target表示的也是一个伪造的target, 而不是真实存在的文件target 。
通常,Makefile中所有不会产生与目标名称相同名称的输出文件的目标都应为PHONY
(6)make常用命令

make
根据Makefile编译源代码,连接,生成目标文件,可执行文件。

make clean
清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。

make install
将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。

make depend

make <module>

make all


all: $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_DUMP_NAME) $(REDIS_CHECK_AOF_NAME)

.PHONY: all

include Makefile.dep
dep:
	$(REDIS_CC) -MM *.c > Makefile.dep

你可能感兴趣的:(C)