一个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.
提示:

参考技术A 在这里all是个伪目标,依赖两个可执行文件delete_cdr write_cron,但是在整个Makefile中,并没有规则去生成这两个可执行文件,仅仅是用mipsel-linux-gcc delete_cdr.o write_cron.o -o ledset,生成了ledset这个二进制文件,所以报错了。 参考技术B 没有在当前文件夹中执行make指令。

从小程序中看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生成的文件为啥不是可执行文件

用makefile 时,linking 无法生成.axf文件。提示Error -1073740791是怎么回事???

Makefile常用万能模板(包括静态链接库动态链接库可执行文件)

Makefile常用万能模板(包括静态链接库动态链接库可执行文件)

编写编译规则文件Makefile,并通过make生成可执行文件