【从零开始的嵌入式生活】LinuxC语言5——Makefile(1)

简介: 【从零开始的嵌入式生活】LinuxC语言5——Makefile(1)

文章目录

 前言

 Make简介

           Makefile基本结构

           Makefile格式

           make的clean——伪目标:

 Make变量

           创建和使用变量

           变量定义的方式

           预定义变量

           自动变量

           环境变量

 Make命令选项和隐含规则

          Make使用

          Makefile隐含规则

 VPATH用法和Makefile嵌套

         VPATH : 虚路径

         Makefile的嵌套

 写在最后

Make简介

Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作 。


工程管理器,顾名思义,是指管理较多的文件


Make将只编译改动的代码文件(根据时间戳),而不用完全编译。

Makefile基本结构

Makefile是Make读入的唯一配置文件 。


由make工具创建的目标体(target),通常是目标文件或可执行文件。

要创建的目标体所依赖的文件(dependency_file)

创建每个目标体时需要运行的命令(command)

命令行前面必须是一个”TAB键”,否则编译错误为:* missing separator. Stop.**

Makefile格式

target : dependency_files
<TAB>  command


例子:


hello.o :  hello.c hello.h
  gcc  –c  hello.c  –o  hello.o


稍微复杂一些的例子:


sunq:kang.o yul.o
  gcc kang.o yul.o -o sunq
kang.o : kang.c kang.h 
  gcc –Wall –O -g –c kang.c -o kang.o
yul.o : yul.c 
  gcc - Wall –O -g –c yul.c -o yul.o
1


回顾一下之前的内容:


-Wall:表示允许发出gcc所有有用的报警信息.

-c:只是编译不链接,生成目标文件”.o”

-o file:表示把输出文件输出到file里

make的clean——伪目标:

这样每次make clean都会无条件执行,而不会因为文件下有同名文件而不执行。


.PHONY:clean
clean:
       rm *.o test


Make变量

创建和使用变量

创建变量的目的:

用来代替一个文本字符串:


系列文件的名字

传递给编译器的参数

需要运行的程序

需要查找源代码的目录

你需要输出信息的目录

你想做的其它事情。

变量定义的方式

递归展开方式VAR=var

简单方式 VAR:=var

变量使用$(VAR)


递归展开方式VAR=var


OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
  $(CC) $(OBJS) -o sunq
kang.o : kang.c kang.h
  $(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
  $(CC) $(CFLAGS) -c yul.c -o yul.o


优点:它可以向后引用变量

缺点:不能对该变量进行任何扩展,例如 CFLAGS = $(CFLAGS) -O会造成死循环

简单方式 VAR:=var


m := mm
x := $(m)
y := $(x) bar
x := later 
echo $(x) $(y)


非常类似于C语言的变量表示方式,这种定义变量的方式更适合在大的编程项目中使用,因为它更像我们一般的编程语言


用?=定义变量


FOO ?= bar


条件定义:如果变量存在不做调整,如果不存在就定义对应的值为bar等价于:


ifeq ($(origin FOO), undefined)
  FOO = bar
endif


为变量添加值

可以通过+=为已定义的变量添加新的值


Main=hello.o hello-1.o
Main+=hello-2.o


预定义变量

AR 库文件维护程序的名称,默认值为ar。AS汇编程序的名称,默认值为as。

CC C编译器的名称,默认值为cc。CPP C预编译器的名称,默认值为$(CC) –E。

CXX C++编译器的名称,默认值为g++。

FC FORTRAN编译器的名称,默认值为f77

RM 文件删除程序的名称,默认值为rm -f

ARFLAGS 库文件维护程序的选项,无默认值。

ASFLAGS 汇编程序的选项,无默认值。

CFLAGS C编译器的选项,无默认值。

CPPFLAGS C预编译的选项,无默认值。

CXXFLAGS C++编译器的选项,无默认值。

FFLAGS FORTRAN编译器的选项,无默认值。

自动变量

$* 不包含扩展名的目标文件名称

$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能 包含重复的依赖文件

$< 第一个依赖文件的名称

$? 所有时间戳比目标文件晚的的依赖文件,并以空格分开

$@ 目标文件的完整名称

$^ 所有不重复的目标依赖文件,以空格分开

$% 如果目标是归档成员,则该变量表示目标的归档成员名称

环境变量

make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量

如果用户在Makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量


相关文章
|
25天前
|
Rust Ubuntu Java
[Linux工具] Makefile
Makefile是Linux环境下用于自动化编译和链接程序的配置文件,常用于简化大型项目的编译流程。通过定义目标文件、依赖文件及生成命令,Makefile能高效管理编译任务。它不仅适用于C语言项目,还可扩展到其他编程语言和非编程任务中。
52 20
[Linux工具] Makefile
|
7天前
|
Unix Linux C语言
【Linux】 Linux makefile 教程
本文详细介绍了 Linux 环境下 Makefile 的基本结构、语法和使用方法,并通过一个简单的 C++ 项目示例演示了 Makefile 的实际应用。Makefile 是一个强大而灵活的工具,通过合理配置,可以极大地简化项目的编译和管理过程,提高开发效率。希望本文能帮助您更好地理解和应用 Makefile,在实际项目中高效管理代码的编译和构建。
37 20
|
6天前
|
Unix Linux C语言
【Linux】 Linux makefile 教程
本文详细介绍了 Linux 环境下 Makefile 的基本结构、语法和使用方法,并通过一个简单的 C++ 项目示例演示了 Makefile 的实际应用。Makefile 是一个强大而灵活的工具,通过合理配置,可以极大地简化项目的编译和管理过程,提高开发效率。希望本文能帮助您更好地理解和应用 Makefile,在实际项目中高效管理代码的编译和构建。
39 16
|
1月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
95 15
|
2月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
121 13
|
3月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
77 1
|
3月前
|
人工智能 安全 算法
基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。
本文深入探讨了基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。C语言因其高效、可移植、灵活及成熟度高等特点,在嵌入式系统开发中占据重要地位。文章还介绍了从系统需求分析到部署维护的完整开发流程,以及中断处理、内存管理等关键技术,并展望了嵌入式系统在物联网和人工智能领域的未来发展。
149 1
|
4月前
|
Linux C++
Linux c/c++之makefile的基础使用
Linux下C/C++项目中makefile的基本使用,包括基础、进阶和高级用法,以及如何创建和使用makefile来自动化编译过程。
50 0
Linux c/c++之makefile的基础使用
|
5月前
|
Shell Linux API
C语言在linux环境下执行终端命令
本文介绍了在Linux环境下使用C语言执行终端命令的方法。首先,文章描述了`system()`函数,其可以直接执行shell命令并返回结果。接着介绍了更强大的`popen()`函数,它允许程序与命令行命令交互,并详细说明了如何使用此函数及其配套的`pclose()`函数。此外,还讲解了`fork()`和`exec`系列函数,前者创建新进程,后者替换当前进程执行文件。最后,对比了`system()`与`exec`系列函数的区别,并针对不同场景推荐了合适的函数选择。
|
6月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
256 3

热门文章

最新文章