【嵌入式Linux学习】8、多文件编译与Makefile初探

举报
ReCclay 发表于 2022/02/22 00:37:59 2022/02/22
【摘要】 一、编译链接 正式开始之前呢,先回顾一下程序编译和链接的过程。 源文件【.c】首先会生成中间目标文件【.o】,再由中间目标文件生成执行文件。 在编译时,编译器只检测程序语法以及函数、变量是否被声明。...

一、编译链接

正式开始之前呢,先回顾一下程序编译和链接的过程。

源文件【.c】首先会生成中间目标文件【.o】,再由中间目标文件生成执行文件。

在编译时,编译器只检测程序语法以及函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)。

二、makefile介绍

Makefile 文件用来告诉计算机,当输入make命令时,需要怎样去编译和链接程序。

1、规则:

  1. 如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
  2. 如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
  3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

当Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

2、makefile的语法格式:

target... : prerequisites ...
command
...

  
 
  • 1
  • 2
  • 3

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)

makefile最本质的一个就是所谓的“依赖”关系,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

三、makefile牛刀小试

Makefile

main:main.o add.o
	gcc main.o add.o -o main
	rm -rf *.o

  
 
  • 1
  • 2
  • 3

main.c

#include "stdio.h"
#include "add.h" 

int main()
{
   int a = 5, b =8;
   
   printf("result:%d\n",add(a,b));
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

add.c


int add(int a,int b)
{
  return a+b;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

add.h

#ifndef __ADD_H__
#define __ADD_H__

int add(int a,int b);


#endif

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

创建以上文件完毕后,在命令行输入make命令进行编译链接…

在这里插入图片描述
而后输入命令./main,执行可执行文件

在这里插入图片描述

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/101700762

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。