GCC
-I、-L、-l
gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib –lworld
(大写i) -I/home/hello/include:表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找顺序:/home/hello/include–> /usr/include –> /usr/local/include
-L /home/hello/lib:表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找顺序:/home/hello/lib –> /lib –> /usr/lib –> /usr/local/lib
(小写l)-lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)
静态库连接
ar rcs libhycu.a *.o
动态链接通俗解析
http://www.cnblogs.com/likwo/archive/2012/05/09/2492225.html
-o0 //不优化代码,编译器不会对代码进行重排
-fPIC -share http://blog.sina.com.cn/s/blog_54f82cc201011op1.html
gcc -MM first.c
产生.h的依赖,输出first.o :first.c *.h
gcc -MD main.c 产生main.d文件,里面内容为:main.o:main.c
mkdep ${CFLAGS} ${SRCS} 产生.depend文件,里面内容时:main.o:main.c
Makefile
更多内容请看《Makefile详解》
$@、$^、$<
- $@ 代表目标
- $^ 代表所有的依赖对象
- $< 代表第一个依赖对象
.c.o:
- 这句话的意思就是 %.o : %.c。也就是说,所有的.o文件,依赖于对应的.c文件
常用函数
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )
#wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。
#notdir把展开的文件去除掉路径信息
#patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o
未完待续