C语言 _ MakeFile(一)

2023-05-16

一、Make简介

  • 工程管理器,顾名思义,是指管理较多的文件。
  • Make工程管理器也就是个“自动编译管理器”,这里的"自动"是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作。
  • Make将只编译改动的代码文件,而不用完全编译。

1、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

2、Makefile变量

  • 一个复杂一些的例子

               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

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

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

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

                 关于更多的使用man工具了解。

3、创建和使用变量

  • 创建变量的目的:
  • 用来代替一个文本字符串

        1、系列文件的名字。

        2、传递给编译器的参数。

        3、需要运行的程序。

        4、需要查找源代码的目录。

        5、需要输出信息的目录。

        6、你想要做的其他事情。

  • 优点:

                 它可以向后引用变量

  • 缺点:

                不能对该变量进行任何扩展,例如

               CFLAGS = $(CFLAGS)   -0  会造成死循环。

  • 简单方式   VAR :=var

                     m :=mm

                     x:=$(m)

                     my:=$(x)bar

                     x:=later

                     echo  $(x)$(y)  ---------   看看打印什么信息。

  • 递归展开式方式VAR=var

例子

 

 

 

          foo = $(bar)

          bar= $(ugh)

          ugh= $(bar)

          foo = Huh?

          $(foo)的值为?

          echo  $(foo)来进行查看

 

 

            — — 用这种方式定义的变量,会在变量的定义点,按照被引用的变量的当前值进行展开

            — — 这种定义变量的方式更适合再大的编程项目中使用,因为它更像我们一般的编程语言。l

例子:

          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

  • 用?=定义变量

                     dir := /foo/bar

                     FOO ?= bar

                     FOO 是?

         — —   含义是 ,如果FOO没有被定义过,那么变量FOO的值就是”bar“,如果FOO先前被定义过,那么这条语句将什么也不做,其等价于:

                         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。

 

             例子:

                     Hello :main .c  main.h

                     <tab> $(CC) -o hello  main.c

                      clean:

                     <tab> $(RM) hello             

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

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

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

          —  CPPFLAGS     C编译器的选项,无默认值

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

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

 例如:

          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

 

  • 自动变量

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

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

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

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

         —  $@          目标文件的完整名称

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

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

例子:

          OBJS = kang.o   yul.o

          CC = gcc

          CFLAGS= -Wall  -O -g

          sunq  : $(OBJS)

                      $(CC) $^ -o $@

          kang.o :kang.c kang.h

                       $(CC)$(CFLAGS) -c  $< -o $@

         yul.o     : yul.c  yul.h

                       $(CC)$(CFLAGS)  -c  $< -o $@

OBJS=f1.o f2.o
OBJS+=main.o
CFLAGS=-c -Wall

test.o:$(OBJS)
	gcc $(OBJS) -o test
f2.o:$<
	gcc -c -Wall f2.c -o $@
f1.o:f1.c
	gcc $(CFLAGS) f1.c -o $@
main.o:main.c
	gcc -c -Wall main.c -o main.o
.PHONY:clean
clean:
	rm *.o test

3、环境变量

  • 环境变量

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

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

  • Make的使用、
  • 选项

          —  -C  dir  读入指定目录下的Makefile

          —  -f   file 读入当前目录下的file文件作为Makefile

          —  -i    忽略所有的命令换行错误

          —  -I  dir 指定被包含的Makefile所在目录

          —  -n 只打印要执行的命令,但不执行这些命令。

          —  -p  显示make变量数据库和隐含规则

          —  -s  在执行命令时不显示命令

          —  -w  如果make在执行过程中改变目录,打印当前目录名。

 

  • 建立一个include 文件夹,将#include <stdio.h>放入该文件夹中

        

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 _ MakeFile(一) 的相关文章

随机推荐

  • 成功解决VSCODE运行C++的报错问题g++

    成功解决VSCODE运行C 43 43 的报错问题g 43 43 解决方案调试 很久写C 43 43 了 xff0c 直接打开C 43 43 写代码测试一下 xff0c 报错 xff0c 真一脸懵逼 捯饬很久 xff0c 解决了问题 解决方
  • linux下的环境变量

    环境变量 环境变量 xff0c 是指在操作系统中用来指定操作系统运行环境的一些参数 通常具备以下特征 xff1a 字符串 本质 有统一的格式 xff1a 名 61 值 值 值用来描述进程环境信息 存储形式 xff1a 与命令行参数类似 ch
  • 【004 关键字】extern “C“的作用是什么?

    一 extern 34 C 34 的作用 extern 34 C 34 关键字常用于C 43 43 和C混合编程中 xff0c 用于指定函数或变量采用C语言的命名和调用约定 加上extern 34 C 34 后 xff0c 会指示编译器这部
  • C++模板编程--学习C++类库的编程基础

    目录 一 函数模板二 类模板三 实现C 43 43 STL向量容器vector代码四 理解容器空间配置器allocator的重要性 一 函数模板 1 模板的意义 xff1a 对类型也可以进行参数化了 2 函数模板 lt 61 是不进行编译的
  • cmake 学习使用笔记(二)库的生成与使用

    学习使用cmake 生成及使用库 xff0c 使用cmake 生成 lib 静态库 及动态库 xff08 dll xff09 及linux 下使用的静态库 a 和 动态库 xff08 so 也称为共享库 xff09 目录 使用工具 生成库
  • cmake 学习使用笔记(五)手动编译

    目录 编译cmake 项目 构建 方式一 xff1a 可执行文件生成的在当前目录 方式二 xff1a 可执行文件生成只制定目录 记录一下手动编译 cmake 项目 编译cmake 项目 项目结构 注意 xff1a 必须要有一个 CMakeL
  • 四旋翼无人机学习第5节--STM32最小系统外围电路分析

    文章目录 1 芯片手册分析2 stm32的外部晶振手册分析2 stm32的外部上电复位手册分析3 电源放置方法4 GND放置方法5 其他元器件放置方法6 网络放置方法7 快捷键分享8 原理图绘制成果分享 快速使用芯片的最好的方式 xff0c
  • 现代C++单文件库(header only)

    nlohmann json https github com nlohmann json easyloggingpp https github com amrayn easyloggingpp
  • 一、ROS创建工作空间

    一 ROS创建工作空间 1 什么是工作空间2 创建工作空间3 编译工作空间4 创建功能包5 编译功能包 xff08 重新编译工作空间 xff09 6 设置环境变量7 运行节点 1 什么是工作空间 工作空间 xff08 workspace x
  • 二、ROS集成开发环境

    二 ROS集成开发环境 1 安装terminator2 安装VScode3 在VScode中使用ROS3 1 创建工作空间3 2 启动VScode3 3 配置VScode3 4 创建功能包3 5 编写C 43 43 文件3 6 配置CMak
  • 十一、Ubuntu18.04下VSCode配置C/C++编译环境

    十一 Ubuntu18 04下VSCode配置C C 43 43 编译环境 1 安装VSCode2 安装插件3 创建工程4 总结 1 安装VSCode 这一步就不谈了 2 安装插件 编译一些简单的cpp文件 xff0c 下面几个插件就够用了
  • 十五、Typora官方主题 + 自定义主题

    十五 Typora官方主题 43 自定义主题 1 下载官方主题2 在官方主题的基础上自定义 1 下载官方主题 首先去Typora官网下载自己喜欢的主题 xff1a 官方主题下载 例如我这里选择 Vue 我们只用到里面的两个主题文件vue c
  • linux---进程控制

    进程控制 fork函数 创建一个子进程 pid t fork void 失败返回 1 xff1b 成功返回 xff1a 父进程返回子进程的ID 非负 子进程返回 0 pid t vfork void 同样时创建一个子进程 xff0c 但是他
  • 十六、windows11下VSCode配置C/C++编译环境

    十六 windows11下VSCode配置C C 43 43 编译环境 1 安装VSCode2 中文插件3 MinGW编译器下载和配置4 VSCode配置c c 43 43 编译环境5 测试是否配置成功6 使用万能头文件 include l
  • 十七、WSL2的安装与使用(Win11)

    十七 WSL2的安装与使用 xff08 Win11 xff09 1 准备工作1 1 开启主板 BIOS 虚拟化1 2 检查是否成功开启虚拟化1 3 开启开发者模式1 4 开启所需Windows功能1 5 下载 WSL 内核升级包 2 开始安
  • 十八、Ubuntu20.04 + VSCode + Opencv3.4.16 配置 + WSL2 可视化

    十八 Ubuntu20 04 43 VSCode 43 Opencv3 4 16 配置 43 WSL2 可视化 1 下载和解压 OpenCV3 4 162 使用 cmake 编译 OpenCV3 配置环境4 代码测试4 1 录制视频4 2
  • IntelRealSense 更新D435固件时,运行rs-fw-update -l后报错:找不到命令

    环境 xff1a Ubantu18 04 摄像头 xff1a IntelRealsense D435 首先确定电脑里已经成功安装了 librealsense 想要更新下D435的固件 xff0c 但是运行rs fw update l后报错
  • Linux _ Shell编程 — 变量

    一 shell脚本的基础知识 1 shell脚本的本质 语言的分类有 xff1a 编译性语言 C语言 C 43 43 语言 JAVA PHP Python等 xff0c 不同编译器编译的执行文件不同 xff0c 运行的平台也不尽相同 解释性
  • USART _ 两串口同时使用,冲突问题

    1 使用外设情况 xff1a 1 初始化了两个串口 xff1a 串口1以及串口2 xff0c 使用串口2DMA发送数据 xff0c 接收中断 接收数据 xff1b 使用串口1发送函数发送数据 xff0c 接收中断接收数据 xff1b 2 问
  • C语言 _ MakeFile(一)

    一 Make简介 工程管理器 xff0c 顾名思义 xff0c 是指管理较多的文件 Make工程管理器也就是个 自动编译管理器 xff0c 这里的 34 自动 34 是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量 xff0c