一个makefile生成两个可执行文件,帮我看看哪错了
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个makefile生成两个可执行文件,帮我看看哪错了相关的知识,希望对你有一定的参考价值。
CC=/ralink/RT288x_SDK/toolchain/buildroot-gcc342/bin/mipsel-linux-gcc
OBJS = delete_cdr.o write_cron.o
CDREXE = delete_cdr write_cron
#stdlibc++ known issue:
#If your program needs libstdc++, please turn off code optimization
CFLAGS +=-I/ralink/RT288x_SDK/source/lib/libsqlite3
LDFLAGS +=-L/ralink/RT288x_SDK/source/lib/libsqlite3 -lsqlite3
LDFLAGS +=-L/ralink/RT288x_SDK/source/romfs/lib -lpthread -ldl
all: delete_cdr write_cron
ledset: $(OBJS)
$(CC) $^ -o $@
romfs:
$(ROMFSINST) /bin/$(CDREXE)
clean:
rm -f $(CDREXE) *.elf *.gdb *.o
~
make: *** No rule to make target `write_cron', needed by `all'. Stop.
提示:
从小程序中看make和Makefile的简单使用
我们都知道程序在执行之前会有两个很重要的过程:编译和链接。当然我们在Windows平台的编译器中(像vs),它会自动帮我们生成最后的执行程序,如(xxx.exe);但是Linux下我们使用vim时,gcc和g++是可以一次性将一个源代码生成可执行程序,可是一个项目可不止一个源文件,一个项目的运作是要将各个源代码编译成目标文件后,再将它们链接起来后执行的。
试想一下如果一个工程有上百个源文件,那你将所有源文件都编译链接完后,程序也能跑起来,然后你的boss不满意,让你修改几处地方,然后你改完之后又得在写一遍,好不容易写完,他还是不乐意,然后你又得写一遍......其实这里你大部分时间都被浪费在无用功上,那些编译和链接的命令其实只要写一遍就好,每回改完只要叫它们再运行一次就好。
而make和Makefile就是可以解决这样的问题,你将你的编译和链接命令写入Makefile中,每回运行的时候执行一下make命令,它就会把你的执行程序给生成出来。如果你要修改的话,那你只要修改完之后在执行下make命令即可,是不是很方便?(嘿嘿),其实学会了make和Makefile的使用对你对编程的学习效率和以后工作效率都有很大帮助,下面来看看它们使用方法吧:
我已进度条这个小程序为例,关于进度条大家肯定不陌生,只要是上过网的都见过,它的代码原理也很简单,我让它每过一个规定的时间,就刷新一个‘#‘,后面跟上百分比。刷新的时候只在当前行,所以每次要回车,代码如下:
#include<stdio.h> #include<string.h> void proc() { char str[102]; char s[]={‘|‘,‘/‘,‘-‘,‘\\‘}; memset(str,‘\0‘,sizeof(str)); int count=100; int i=0; for(;i<=count;++i) { str[i]=‘#‘; printf("[%-100s][%d%%][%c]\r",str,i,s[i%4]); usleep(100000); fflush(stdout); } printf("\n"); return; } int main() { proc(); return 0; }
结果由于是动态的,这里不好发图,就不展示了,我们还是看后面的Makefile怎么编写吧,这才是重点。
上面是一个已经写好的源文件叫proc.c,它生成应用程序proc要经过下面的过程:
Makefile的编写要把握住两个点:依赖关系和依赖方法
就那上面的程序来说,我们最后要生成proc的程序,proc要通过proc.o来生成,可是现在没有proc.o,所以就在往后看proc,o是由proc.s生成,接着往下推就会发现我们推到peoc.c,因为proc.c是存在的,因此它可以生成proc.i,然后再往上推,最后就可以生成proc这个程序了。
上面这个就是整个程序的依赖关系,而依赖方法就是我们所使用的命令啦,下面是proc.c的Makefile的编写:
先是依赖关系,然后是依赖方法,写依赖关系时目标文件在前,依赖文件在后
还有一点需要提醒的是在写依赖方法时,前面要加Tab键
在Makefilr中有一个不成文的规定:
每一个Makefile中都要有清空目标文件的能力
毕竟自己写的东西要自己负责嘛,如果么有的话,你的程序改完后还是要将之前的程序删掉,这样不好管理,有时还会坑到别人,所以要有这个“修养”!
清理目标文件的方法就是先用.PHONY创建一个“伪目标”,我上面的clean就是一个伪目标,再给伪目标定义方法,也就是删除目标文件的命令。
还有规定claer必须放在文件最后!
接下来就是执行我们的make命令来看看效果了,这里先说下make是怎么工作的哈:
当make执行起来后,会找当前目录下的Makefile文件,然后找第一个目标文件,并把它作为最终文件,并通过你给的依赖方法生成最终文件,然后停止。
由于我们的clean和最终文件没有半毛钱关系,所以想要执行clean,就要用make命令进行显示调用才起作用。
我们可以通过上面的例子来看看make的效果:
首先先执行make
这时候出现proc,说明文件成功被编译链接。
然后我们再用make显示执行下clean:
proc程序也就消失了
这就是make和Makefile的基本用法,还是很方便的,希望大家看完之后对你们有所帮助,在说拜拜之前,补充下如果想在终端显示依赖方法的话,就把前面的@去掉哦!
好了,再了个见呐!
本文出自 “Waitting” 博客,请务必保留此出处http://cuiyuxuan.blog.51cto.com/10786939/1784995
以上是关于一个makefile生成两个可执行文件,帮我看看哪错了的主要内容,如果未能解决你的问题,请参考以下文章
linux shell: 帮我解释下这个makefile每一行的意思嘛
用makefile 时,linking 无法生成.axf文件。提示Error -1073740791是怎么回事???
Makefile常用万能模板(包括静态链接库动态链接库可执行文件)