当前位置: 首页 > news >正文

Makefile简单使用

makefile

示例程序:

  • 头文件functions.h
#ifndef _FUN_
#define _FUN_
void printhello();
int factorial(int n);
#endif
  • 文件factorial.cpp
#include "functions.h"
int factorial(int n){if(n==1){return 1;}else{return n * factorial(n - 1);}
}
  • 文件printHello.cpp
#include <iostream>
#include "functions.h"
using namespace std;
void printhello(){int i;cout << "hello world" << endl;
}
  • 文件main.cpp
#include <iostream>
#include "functions.h"
using namespace std;
int main(){printhello();cout << "The factorial of 5 is:" << factorial(5) << endl;return 0;
}

普通编译

g++ main.cpp factorial.cpp printHello.cpp -o mmm

三个文件顺序没区别

可以把-o提前:

g++ -o hello main.cpp factorial.cpp printHello.cpp

逐个编译

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每次-c都是链接成一个-o文件,最后把所有的.o文件链接在一起生成main

在这里插入图片描述

makefile编译

版本1:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在含有Makefile文件下直接make就可以编译

版本2:

#定义变量
CXX = g++
TARGET = ok
OBJ = main.cpp printHello.cpp factorial.cpp
#声明的变量用$(变量名)进行访问
$(TARGET):$(OBJ)$(CXX) -o $(TARGET) $(OBJ)

但是一般多文件都是用.o文件来链接的

#定义变量
CXX = g++
TARGET = ok
OBJ = main.o printHello.o factorial.o
#声明的变量用$(变量名)进行访问
$(TARGET):$(OBJ)$(CXX) -o $(TARGET) $(OBJ)
#*.o文件的生成
main.o : main.cpp$(CXX) main.cpp -c
#-c的位置无要求
printHello.o : printHello.cpp$(CXX) -c printHello.cpp
factorial.o : factorial.cpp	$(CXX) -c factorial.cpp

在这里插入图片描述

版本3:

  • $@代表目标文件
  • $^代表所有的依赖文件
  • $<代表第一个依赖文件
  • 自动变量结合通配符%
CXX = g++
TARGET = hello
OBJ = main.o printHello.o factorial.o
#定义编译选项变量
CXXFLAGS = -c -Wall
#$@是目标文件即$(TARGET)
#$^是所有的编译文件即$(OBJ)
$(TARGET):$(OBJ)$(CXX) -o $@ $^
#*.o文件的生成
#$<是第一个编译文件
%.o : %.cpp$(CXX) $(CXXFLAGS) $< -o $@
#-f是强制删除,删除所有.o文件和hello文件
.PHONY : clean
clean:rm -f *.o $(TARGET)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

版本四

wildcard:显示指定路径下指定文件类型的所有文件

$(wildcard 指定文件类型)

# $(<function> <arguments>)
# 函数的调用以$开头,用{}或者()将函数名以及参数包含起来
# <function>为函数名,<arguments>为参数,两者之间以空格分隔
# 若存在多个<arguments>参数,使用,分开
$(subst t,e,maktfilt) 

patsubst函数调用原型:

$(patsubst ,, )

patsubst函数返回被替换过后的字符串

# $(patsubst  <pattern>,<replacement>,<text>)
# patsubst函数判断<text>中字符串是否匹配<pattern>模式
# <replacement>中的这个%将是所返回的字符串#把字符串“x.c.c bar.c”符合模式%.c的单词替换成%.o,返回“x.c.o bar.o”。
$(patsubst %.c,%.o,x.c.c bar.c)
GPP = g++
TARGET = helloworld
SRC = $(wildcard *.cpp)
OBJ =$(patsubst %.cpp, %.o, $(SRC))
GPPFLAGS = -c $(TARGET):$(OBJ)$(GPP) -o $@ $^%.o:%.cpp$(GPP) $(GPPFLAGS) $< -o $@.PHONY:clean
clean:rm -f *.o $(TARGET)

这样增加了cpp文件连makefile都不用修改


程序2

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • include文件夹下的base.h
#ifndef __BASE__H
#define __BASE__H#define BUFFSIZE    64#endif
  • src文件夹下的main.cpp
#include <iostream>
#include "base.h"int main(int argc, char *argv[])
{char username[BUFFSIZE] = {0};std::cout << "Hello world" << std::endl;std::cout << "Please Input Your Name :" <<std::endl;std::cin >> username;std::cout << "Hi! " << username << " , Welcome China !" << std::endl;return 0;
}
  • Makefile
#pwd等linux命令n前面必须加shell
pwd=${shell pwd}
src_dir=$(pwd)/src/
include_dir=$(pwd)/include/#目标可执行文件
TARGET=TcpServerDemo
########################## src section #################################
#find指令:find 路径 -name 待查找文件
obj_src=${shell find $(src_dir) -name "*.cpp"}
#先.cpp再.o,逗号要相邻,隔开会发生错误
OBJS=${patsubst %.cpp,%.o,$(obj_src)}
####################### flag section ########################################
GXX=g++
CFLAGS=-I${include_dir}
#############################################################################
$(TARGET): $(OBJS)$(GXX) $(CFLAGS)  -o $@ $^
#别忘了-c
%.o:%.cpp$(GXX) ${CFLAGS} -c -o $@ $<clean:rm $(TARGET)rm $(OBJS)

执行结果

g++ -I/home/guojiawei/Desktop/TcpDemo/include/ -c -o            /home/guojiawei/Desktop/TcpDemo/src/main.o /home/guojiawei/Desktop/TcpDemo/src/main.cpp
g++ -I/home/guojiawei/Desktop/TcpDemo/include/  -o TcpServerDemo /home/guojiawei/Desktop/TcpDemo/src/main.o

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [论文笔记]Improving Retrieval Augmented Language Model with Self-Reasoning
  • 基于神经塑性的地球观测多模态基础模型 (慕尼黑工业大学, TUM)
  • zookeeper集群安装
  • 标配M4芯片!苹果三款Mac新品蓄势待发
  • lucene搜索关键词错误
  • 企业级web应用服务器tomcat
  • 学习前端面试知识(15)
  • 强制输出wParam 和 lParam,会是什么内容?
  • 数据仓库系列 3:数据仓库的主要组成部分有哪些?
  • jmeter中CSV 数据文件设置用例
  • DescuentosController : ControllerBase
  • MySQL 系统学习系列 - SQL 语句 DML 语句的使用《MySQL系列篇-02》
  • 数学建模学习(125):使用Python实现Borda计数法进行多标准决策分析
  • 【嵌入式开发之网络编程】TCP端口和UDP端口
  • 《计算机网络-期末模拟卷》
  • Apache Spark Streaming 使用实例
  • Hexo+码云+git快速搭建免费的静态Blog
  • IDEA 插件开发入门教程
  • Python - 闭包Closure
  • ReactNativeweexDeviceOne对比
  • 分类模型——Logistics Regression
  • 关于List、List?、ListObject的区别
  • 入口文件开始,分析Vue源码实现
  • 数组大概知多少
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # centos7下FFmpeg环境部署记录
  • #### golang中【堆】的使用及底层 ####
  • #nginx配置案例
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #在 README.md 中生成项目目录结构
  • (多级缓存)缓存同步
  • (二)JAVA使用POI操作excel
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十) 初识 Docker file
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .mysql secret在哪_MySQL如何使用索引
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net Signalr 使用笔记
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET框架
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • .sdf和.msp文件读取
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @angular/cli项目构建--http(2)
  • @RequestBody与@RequestParam
  • @RestControllerAdvice异常统一处理类失效原因
  • [C#]DataTable常用操作总结【转】
  • [C++] Windows中字符串函数的种类