1 -static 这个选项,当gcc连接库的时候,如果同时存在静态库和共享库,默认是连接共享库,而指定了-static 就优先连接静态库。
2 WEC_LDFLAGS=-I$(LIB) -I$(LIB1) 这是一句字符串展开替换,然后赋值给WEC_LDFLAGS,就类似于sprintf(WEC_LDFLAGS, "-l%s -l%s" , LIB, LIB1); 这种语法在makefile里面很常用。其实CC=arm-linux-gcc -O2 -I$(INC) -I$(INC1) -static 和这句的道理是一样的,都是展开替换。
3 LIBS= -lpthread -lc -lgcc -liconv -lfreetype -lpng -lz -lm -ljpeg -lgif 这句是什么意思,这句是你这个makefile,连接时所有库的选项。可以把它看成一个字符串,(其实makefile里面定义这些变量,都是字符串)这里定义的LIBS变量的具体用处下面再说。至于你问的-l和-L的区别 -llibrary指定连接某一个库,-Ldir指定连接时搜索库的路径;比如你自己的库,或者下载的第三方库,不然编译器将只在标准库的目录找,这个dir就是目录的名称。而-I(大写i)指定了编译时的头文件搜索目录。
4
all:
$(CC) $(WEC_LDFLAGS) $(SRCS) -o $(TARGET) $(LIBS)
//$(LIBS)这个干嘛的?
这句才是makefile的核心 这种target:语法,是定义了一个工作目标。
all:是make默认的工作目标,它干了些啥呢
首先 $(CC) 展开了这个变量CC=arm-linux-gcc -O2 -I$(INC) -I$(INC1) -static 其实就是调用gcc的命令行字符串。
然后 $(WEC_LDFLAGS)展开了这个变量WEC_LDFLAGS=-I$(LIB) -I$(LIB1) 其实是指定了库目录,我猜你抄错了吧这里看着就应该是-L$(LIB) -L$(LIB1)
然后 $(SRCS)展开了源文件tom_ACDC.c uart_control.c lcm.c font.c touch.c control.c database.c communication.c filesystem.c rtc.c gprs.c
然后 $(TARGET)展开了编译目标 tom_ACDC_02
然后 $(LIBS) 展开需要连接的单个库,到此,工作目标的第一个命令行字符串就构造完毕了
这行$(CC) $(WEC_LDFLAGS) $(SRCS) -o $(TARGET) $(LIBS)就等价于运行一个shell命令:
arm-linux-gcc -O2 -I$(INC) -I$(INC1) -static -L/usr/local/arm_linux_4.2/lib/gcc/arm-linux/4.2.1
) -L/usr/local/arm_linux_4.2/arm-linux/lib tom_ACDC.c uart_control.c lcm.c font.c touch.c control.c database.c communication.c filesystem.c rtc.c gprs.c -o tom_ACDC_02 -lpthread -lc -lgcc -liconv -lfreetype -lpng -lz -lm -ljpeg -lgif 这就是展开后实际运行的命令,分开定义然后展开是为了方便大家扩展,和维护,要是不这样,直接给你写这么长一串东西,谁看了都得晕。
5
$(STRIP) $(TARGET)
//这句什么意思?
这句其实是工作目标all的第二行命令
展开后其实很简单就是arm-linux-strip tom_ACDC_02
这句的用处就是在4里面命令编译连接生成目标文件tom_ACDC_02后,再调用arm-linux-strip来去掉目标文件中的调试信息,减小文件大小。
6
clean:
rm -f *.o
......
rm -f *.gdb
//为什么要清除这些呢? 源文件都没有的。
这里,clean是这个makefile的第二个工作目标,这个工作目标平时是不执行的
只有你在用make clean这样来运行make的时候才会执行这个工作目标,也很简单就是单纯的清除中间文件而已。
GUNmake太博大精深了,是可以用一辈子的东西,如果要深入了解,你可以研习附件里面的GNUmake的教程。
CC=arm-linux-gcc -O2 -I$(INC) -I$(INC1) -static
//这句什么意思? -static是什么意思?
-static是gcc的一个编译选项 在编译过程中对动态链接不进行链接 其官方解释为
Do not link against shared libraries
WEC_LDFLAGS=-I$(LIB) -I$(LIB1)
//怎么可以等两个路径的?两个路径之间不是用“:”分开的吗?
makefile的变量定义 在这个赋值之后 WEC_LDFLAGS的值为
-l/usr/local/arm_linux_4.2/lib/gcc/arm-linux/4.2.1 -l/usr/local/arm_linux_4.2/arm-linux/lib
这个是要用在编译中的 也就是arm-linux-gcc的编译选项之一 不需要加冒号分隔 而是要求空格分隔
LIBS= -lpthread -lc -lgcc -liconv -lfreetype -lpng -lz -lm -ljpeg -lgif
//这句什么意思?怎么等这么多的? -l和-L和-I有什么区别?
-l是引入动态链接库 -lxxx定义后 编译的时候会把对应的libxxx.so引入
-L是指定库的路径,也就是说会在-L的文件夹中去寻找库文件
$(CC) $(WEC_LDFLAGS) $(SRCS) -o $(TARGET) $(LIBS)
//$(LIBS)这个干嘛的?
这个就是引入动态链接库啦 就像上面说的一样
其实上面的所有都是i定义变量 这句才是真正其效果的
换句话说 把上面所有变量替换到这里 把makefile只写几行 效果一样 不过看要看吐血了,而且也不易于维护
$(STRIP) $(TARGET)
//这句什么意思?
调用arm-linux-strip 把target中的所有调试信息去掉。不影响可执行程序功能 但是可以大幅度减少该文件的大小
clean:
rm -f *.o
rm -f *.x
rm -f *.flat
rm -f *.map
rm -f temp
rm -f *.img
rm -f $(TARGET)
rm -f *.gdb
//为什么要清除这些呢? 源文件都没有的。
clean的效果就是删除所有编译过程中生成的中间文件以及目标文件
一个完全的clean就是把整个工作环境恢复到没有执行编译前的效果