首页 > 其他分享 >Makefile简单使用

Makefile简单使用

时间:2024-12-10 16:10:09浏览次数:4  
标签:test1 src gcc test2 简单 Makefile 使用 output main

此篇文章在2022年10月24日被记录

Makefile简单实用

1、GCC使用

当我们只有一个C文件时,可以用gcc编译直接生成文件,例如写一个main.c

#include <stdio.h>
int main()
{
printf("this is main.c\r\n");
return 0;
}

我们在命令行输入

    sudo gcc -c main.c -o a.out

编译完成后就可以当前文件夹下找到可执行程序a.out,直接执行./a.out就可以打印出想要的结果,但是在实际项目中,一个工程肯定不可能只有一个main.c,也会存在对其他文件的调用,但是使用gcc一个个的生成中间文件,可执行文件,那可是相当麻烦,因此可以使用makefile文件来进行统一处理。

2、make使用

在这里来做一个最简单的示例,建立一个小工程,项目路径是这样:

├── inc
│   ├── test1.h
│   └── test2.h
├── Makefile
└── src
    ├── main.c
    ├── test1.c
    └── test2.c

其中,main.c文本为:

#include <stdio.h>
#include "test1.h"
#include "test2.h"
int main(void)
{
    	printf("hello world!\r\n");
        fun_test1();
        fun_test2();
        return 0 ;
}

test1.c为

#include "test1.h"
#include "stdio.h"
void fun_test1()
{
        printf("this is test1!\r\n");
}

test2.c为

#include "test2.h"
#include "stdio.h"
void fun_test2()
{
        printf("this is test2!\r\n");
}

test1.h为

#ifndef __TEST_1_
#define __TEST_1_
void fun_test1();
#endif

test2.h为

#ifndef __TEST_2_
#define __TEST_2_
void fun_test2();
#endif

makefile文件为:

VERSION = 1.0     #程序版本号  
SOURCE = $(wildcard ./src/*.c)  #获取所有的.c文件  
OBJ = $(patsubst %.c, %.o, $(SOURCE))   #将.c文件转为.o文件  
INCLUDES = -I./inc    #头文件路径  

# LIBS = -ldylib      #库文件名字  
# LIB_PATH = -L./lib  #库文件地址  

DEBUG = -D_MACRO    #宏定义  
CFLAGS = -Wall -c   #编译标志位  

TARGET = app  
CC = gcc

$(TARGET): $(OBJ)     
	@mkdir -p output/   #创建一个目录,用于存放已编译的目标  
	$(CC) $(OBJ) $(LIB_PATH) $(LIBS) -o output/$(TARGET)

%.o: %.c  
	$(CC) $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@  
 
.PHONY: clean  
clean:  
	rm -rf $(OBJ) output/

简单看一下,说白了makefile就是bash指令与gcc指令的集合,在使用中,例如mkdir、rm等bash指令必须使用tab缩进。
再添加到自己的工程中时,设定对应的源文件,头文件路径,库文件路径(我这里没用到,注释掉了),宏定义输出目标路径名称与文件名称,在命令行中执行make,出现以下结果:

shumei@ubuntu:~/Desktop/makeTest$ make
gcc -I./inc     -D_MACRO     -Wall -c    src/test2.c -o src/test2.o  
gcc -I./inc     -D_MACRO     -Wall -c    src/main.c -o src/main.o  
gcc -I./inc     -D_MACRO     -Wall -c    src/test1.c -o src/test1.o  
gcc  ./src/test2.o  ./src/main.o  ./src/test1.o      -o output/app  

看一下增加了哪些文件:

shumei@ubuntu:~/Desktop/makeTest$ tree
.
├── inc
│   ├── test1.h
│   └── test2.h
├── Makefile
├── output
│   └── app
└── src
    ├── main.c
    ├── main.o
    ├── test1.c
    ├── test1.o
    ├── test2.c
    └── test2.o

3 directories, 10 files

在output文件夹下执行文件:

shumei@ubuntu:~/Desktop/makeTest$ cd output
shumei@ubuntu:~/Desktop/makeTest/output$ ls
app
shumei@ubuntu:~/Desktop/makeTest/output$ ./app
hello world!
this is test1!
this is test2!

标签:test1,src,gcc,test2,简单,Makefile,使用,output,main
From: https://www.cnblogs.com/shumei52/p/18597548

相关文章

  • 防水工程的验收规范主要是为了确保建筑物在使用过程中不会因防水层失效而导致渗漏或结
    防水工程的验收规范主要是为了确保建筑物在使用过程中不会因防水层失效而导致渗漏或结构损坏。防水工程的验收包括对防水材料的质量、施工工艺、施工完工后的效果等方面的检查。以下是防水工程验收的主要规范和标准。1. 主要参考规范与标准《建筑防水工程施工质量验收规范》(GB......
  • 贴砖工程的验收规范主要依据国家和行业的相关标准,确保施工质量符合设计要求,并确保使用
    贴砖工程的验收规范主要依据国家和行业的相关标准,确保施工质量符合设计要求,并确保使用中的安全性和耐久性。下面是一些关键的验收规范和标准,涵盖了瓷砖铺设的质量控制、检测方法、合格标准等方面。1. 主要参考规范与标准《建筑装饰装修工程质量验收规范》(GB50210)《建筑工程......
  • 记录一个很简单的压缩编码--ADPCM
    此篇文章在2022年9月22日被记录ADPCM是一种很简单实现的音频编码方式,真正的PCM相当占用内存,这对网络和内存的压力是相当大的,因此通常需要压缩编码,ADPCM是一种可以运行在单片机上的编码方式,原理如下:由于声音信号具有波形上的连续性,因此相邻两个采样值大小也非常接近,记录单个采......
  • 使用ESP32做一个MQTT协议的公网对讲机
    此篇文章在2022年8月14日被记录使用MQTT做一个公网对讲机上一篇博客中,使用ESP32与ESP-NOW协议做了一个短距离对讲机(链接),发布了一个视频在B站评论区中,很多B友希望可以实现无限距离对讲,这样的话需要服务器转发,刚开始我想使用python写一个TCP或者UDP的转发功能,但是考虑到很多小......
  • 移动端使用cordova-plugin-wechat实现微信授权登录,可以拉起微信,点击允许之后没有进入
    开发移动端使用微信授权登录时,遇到了这个问题,被困了两天终于在第三天好了。我使用的写法是cordova-plugin-wechat-npm里提供的写法: 一模一样复制下来的。一开始看到别的地方多传了一个appID的参数,我加传之后会报错,还是改回按照文档的这个写法。一开始以为是没授权,实际上看......
  • 在冬天使用4G无线太阳能供电视频监控系统,应注意哪些方面?
    随着冬季的到来,4G无线太阳能供电系统面临着低温和日照时间缩短的双重挑战。在这个季节,太阳能电池板的效率可能会因为积雪覆盖和光线角度的变化而降低,同时,系统的电池储能和逆变器等组件也需要适应极端的温度条件。因此,设计和维护一个在冬季也能稳定运行的4G无线太阳能供电系统,需要......
  • 使用ESP32做一个实时语音对讲系统
    此篇文章在2022年8月5日被记录最近突发奇想,制作一个数字式的音频通信系统,顺便学习一下I2S与ESP-NOW协议刚开始查阅资料,发现油管上的已经有人做过了,但是使用的C++,并用了数据流的处理流程,比较晦涩难懂,代码量也很大,属于是炫技的作品,我这篇文章使用C重新写一遍,并且代码量大大降低,......
  • 掌握这10个ChatGPT使用方法,你的论文也可以写的与众不同!
    ChatGPT不仅可以协助完成论文写作的基本任务,还能够通过多样的提示词和独特的技巧来提升写作的创意性和学术深度。今天的分享,我们将详细介绍一些高效的ChatGPT使用方法和具体的提示词示例,帮助您更好地完成论文写作,提升文章质量。一键完成论文初稿,请关注底部微信公众号!1.反面......
  • 在 Debian 中使用 APT 包管理工具通过 Ubuntu PPA 安装最新软件包
    在Debian中使用APT包管理工具通过UbuntuPPA安装最新软件包Neovim0.10.0在24年5月发布了.考虑许久后笔者决定试着从Vim9转向Neovim.其中遇到的第一个问题是,Debian的默认源里只有Neovim0.7.7,因此寻找下载最新软件包的方法,并做下详细记录.虽然本文初衷......
  • STM32中使用低功耗定时器延时
    此篇文章在2022年5月19日被记录上文说了STM32L4的几种低功耗模式,将其应用起来作为一个低功耗的延时方案。为什么使用低功耗定时器,在追求长时间续航时,单片机有时需要切换到低功耗模式或者停止模式下,在这种模式下,系统主时钟关闭,有一些依赖于系统主时钟的应用程序,可能会发生出现......