(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