makefile编写练习

news2024/11/29 12:38:27

makefile编写练习


OVERVIEW

  • makefile编写练习
      • 文件结构
      • 直接编译整个项目并运行
      • 将项目制作成为静态库
      • 将项目制作成为动态库

编写makefile文件来编译带头文件的程序,

文件结构

初始项目文件结构,如下所示:

在这里插入图片描述

#ifndef ADD_HPP
#define ADD_HPP

int m_add(int a, int b);

#endif //ADD_HPP
#ifndef MINUS_HPP
#define MINUS_HPP

int m_minus(int a, int b);

#endif //MINUS_HPP
#include "add.hpp"

int m_add(int a, int b)
{
    return a + b;
}
#include "minus.hpp"

int m_minus(int a, int b)
{
    return a - b;
}
#include "add.hpp"
#include "minus.hpp"
#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int b = 5;
    int add_d = m_add(a, b);
    int minus_d = m_minus(a, b);
    cout << "a + b = " << add_d << endl;
    cout << "a - b = " << minus_d << endl;
    return 0;
}

直接编译整个项目并运行

文件结构如下:

  1. objs目录为中间产生的目标文件,
  2. run目录为链接静态库后生成的可执行文件存放路径,

在这里插入图片描述

# makefile文件
cpp_srcs:=$(shell find src -name *.cpp)
cpp_objs:=$(patsubst src/%.cpp, objs/%.o, $(cpp_srcs))

include_paths:=/home/luochenhao/3.tool_tech/libTest/headfile_test/include
I_flags:=$(include_paths:%=-I %)

compile_options:= -g -O3 -w $(I_flags)

# 编译
objs/%.o:src/%.cpp
	mkdir -p $(dir $@)
	g++ -c $^ -o $@ $(compile_options)

# 链接生成可执行文件
run/exec:$(cpp_objs)
	mkdir -p $(dir $@)
	g++ $^ -o $@

# 执行可执行文件
run:run/exec
	./$<

# 清理
clean:
	rm -rf objs run

# 测试
debug:
	echo $(cpp_srcs)
	echo $(cpp_objs)
	echo $(include_paths)
	echo $(I_flags)
	echo $(compile_options)

将项目制作成为静态库

文件结构如下:

  1. lib目录为编译打包后的静态库目录,静态库名称为libxxx.a
  2. objs目录为中间产生的目标文件,
  3. run目录为链接静态库后生成的可执行文件存放路径,

在这里插入图片描述

lib_srcs:=$(filter-out src/main.cpp, $(shell find src -name *.cpp))
lib_objs:=$(patsubst src/%.cpp, objs/%.o, $(lib_srcs))

include_paths:=./include
library_paths:=./lib
library_name:=xxx

I_option:=$(include_paths:%=-I %)	# 指定头文件路径
L_option:=$(library_paths:%=-L %)	# 指定库的路径
l_option:=$(library_name:%=-l %)	# 指定库名

compile_options:= -g -O3 -std=c++11 -w $(I_option)	# 编译选项
linking_options:= $(L_option) $(l_option)				# 链接选项

#####################################编译静态库
# 编译
objs/%.o:src/%.cpp
	mkdir -p $(dir $@)
	g++ -c $^ -o $@ $(compile_options) 

# 打包成为第三方静态库
lib/libxxx.a:$(lib_objs)
	mkdir -p $(dir $@)
	ar -r $@ $^

#####################################链接静态库
# 编译
objs/main.o:src/main.cpp
	mkdir -p $(dir $@)
	g++ -c $^ -o $@ $(compile_options)

# 链接静态库
run/exec:objs/main.o
	mkdir -p $(dir $@)
	g++ $^ -o $@ $(linking_options)

#####################################其他
# 清理
clean:
	rm -rf objs lib run

# 测试
debug:
	echo $(include_paths)
	echo $(compile_options)
	echo $(linking_options)

将项目制作成为动态库

文件结构如下:

  1. lib目录为编译打包后的静态库目录,动态库名称为libxxx.so
  2. objs目录为中间产生的目标文件,
  3. run目录为链接动态库后生成的可执行文件存放路径,

在这里插入图片描述

lib_srcs:=$(filter-out src/main.cpp, $(shell find src -name *.cpp))
lib_objs:=$(patsubst src/%.cpp, objs/%.o, $(lib_srcs))

include_paths:=./include
library_paths:=./lib
library_name:=xxx

I_option:=$(include_paths:%=-I %)			# 指定头文件路径
L_option:=$(library_paths:%=-L %)			# 指定库的路径
l_option:=$(library_name:%=-l %)			# 指定库名

compile_options:= -g -O3 -std=c++11 -w -fPIC $(I_option)		# 编译选项
linking_options:= $(L_option) $(l_option)						# 链接选项

#####################################编译静态库
# 编译
objs/%.o:src/%.cpp
	mkdir -p $(dir $@)
	g++ -c $^ -o $@ $(compile_options) 

# 打包成为第三方动态库
lib/libxxx.so:$(lib_objs)
	mkdir -p $(dir $@)
	g++ -shared $^ -o $@

#####################################链接动态库
# 编译
objs/main.o:src/main.cpp
	mkdir -p $(dir $@)
	g++ -c $^ -o $@ $(compile_options)

# 链接动态库
run/exec:objs/main.o
	mkdir -p $(dir $@)
	g++ $^ -o $@ $(linking_options)

#####################################其他
# 清理
clean:
	rm -rf objs lib run

# 测试
debug:
	echo $(include_paths)
	echo $(compile_options)
	echo $(linking_options)
	
test: lib/libxxx.so run/exec 
	./run/exec

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1253916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈详解(C语言)

文章目录 写在前面1 栈的定义2 栈的初始化3 数据入栈4 数据出栈5 获取栈顶元素6 获取栈元素个数7 判断栈是否为空8 栈的销毁 写在前面 本片文章详细介绍了另外两种存储逻辑关系为 “一对一” 的数据结构——栈和队列中的栈&#xff0c;并使用C语言实现了数组栈。 栈C语言实现源…

Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线(实例分析)

Visual Studio 使用MFC 单文档工程从创建到实现绘制单一颜色直线和绘制渐变颜色的直线 本文主要从零开始创建一个MFC单文档工程然后逐步实现添加按键&#xff08;事件响应函数&#xff09;&#xff0c;最后实现单一颜色直线的绘制与渐变色直线的绘制o(&#xffe3;▽&#xffe…

2、Burp使用

文章目录 一、为Firefox浏览器安装数字证书二、利用Intruder模块进行暴力破解 一、为Firefox浏览器安装数字证书 &#xff08;1&#xff09;利用Firefox浏览器访问http://burp或127.0.0.1:<监听端口>&#xff0c;点击页面右上侧的“CA Certificate”处下载CA证书&#xf…

靡靡之音 天籁之声 ——Adobe Audition

上一期讲到了和Pr配合使用的字幕插件Arctime Pro的相关介绍。相信还记得的小伙伴应该记得我还提到过一个软件叫做Au。 当人们对字幕需求的逐渐满足&#xff0c;我们便开始追求更高层次的享受&#xff0c;当视觉享受在进步&#xff0c;听觉享受想必也不能被落下&#xff01; Au即…

【模板】KMP算法笔记

练习链接&#xff1a;【模板】KMP - 洛谷 题目&#xff1a; 输入 ABABABC ABA 输出 1 3 0 0 1 思路&#xff1a; 根据题意&#xff0c;用到的是KMP算法&#xff0c;KMP算法思想是通过一个一个匹配首字母的原理进行整个匹配效果&#xff0c;当某个首字母不匹配的时候&#x…

【全栈开发】Blitz.js与RedwoodJS

技术的不断发展是必然的。如果你仔细观察这片土地&#xff0c;你会注意到随着技术的成熟而出现的某些模式。特别是&#xff0c;开发人员一直在努力提高性能&#xff0c;简化开发过程&#xff0c;增强开发人员体验。 在本指南中&#xff0c;我们将分析两个帮助全栈应用程序世界…

2023年3月电子学会青少年软件编程 Python编程等级考试一级真题解析(判断题)

2023年3月Python编程等级考试一级真题解析 判断题(共10题,每题2分,共20分) 26、在Python编程中,print的功能是将print()小括号的内容输出到控制台,比如:在Python Shell中输入print(北京,你好)指令,小括号内容可以输出到控制台 答案:错 考点分析:考查python中print…

Proteus仿真--基于PG12864LCD设计的指针式电子钟

本文介绍基于PG12864LCD设计的指针式电子钟&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计中时间芯片选用DS1302芯片&#xff0c;液晶选用PG12864LCD模块&#xff0c;按键K1-K3&#xff0c;K1用于时分选择&#xff0c;K2用于调整功能&#xff0c…

积跬步至千里 || 为循环添加进度条

有时候&#xff0c;我们的Python程序需要运行较长时间&#xff0c;原因是一些环节占用时间太长&#xff08;如for循环&#xff09;。如果我们要观察那些占用时间任务的执行进度&#xff0c;那么有一个进度条能实时的显示任务进度情况的话&#xff0c;将会非常方便。而tqdm库就是…

Docker容器化部署若依微服务ruoyi-cloud项目

系统环境 接下来的内容以 Ubuntu 22.04.1 操作系统为例。 下载安装Docker Ubuntu hihi-IdeaCentre-GeekPro-15ICK:~$ sudo su [sudo] hi 的密码&#xff1a; roothi-IdeaCentre-GeekPro-15ICK:/home/hi# docker ps 找不到命令 “docker”&#xff0c;但可以通过以下软件包安…

JDK、JRE、JVM的特点和关联

Java 的三个重要的概念是 JDK&#xff08;Java Development Kit&#xff09;、JRE&#xff08;Java Runtime Environment&#xff09;和 JVM&#xff08;Java Virtual Machine&#xff09;。它们之间有着密切的关联&#xff0c;同时又有不同的职责和特点。 JDK&#xff08;Java…

使用skforecast进行时间序列预测

时间序列预测是数据科学和商业分析中基于历史数据预测未来价值的一项重要技术。它有着广泛的应用&#xff0c;从需求规划、销售预测到计量经济分析。由于Python的多功能性和专业库的可用性&#xff0c;它已经成为一种流行的预测编程语言。其中一个为时间序列预测任务量身定制的…

【数据库】执行计划中二元操作对一趟扫描算法的应用,理解代价评估的应用和优化,除了磁盘代价还有CPU计算代价不容忽略

二元操作的一趟算法 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定…

makefile项目构建

makefile项目构建 OVERVIEW makefile项目构建1.概念2.make选项3.makefile语法&#xff08;1&#xff09;基本语法&#xff08;2&#xff09;系统与自定变量&#xff08;3&#xff09;常用函数&#xff08;4&#xff09;模式匹配与伪目标 4.makefile编译流程&#xff08;1&#…

机器学习---贝叶斯网络与朴素贝叶斯

1. 贝叶斯法则 如何判定一个人是好人还是坏人&#xff1f; 当你无法准确的熟悉一个事物的本质时&#xff0c;你可以依靠与事物特定本质相关的事件出现的次数来判断 其本质属性的概率。如果你看到一个人总是做一些好事&#xff0c;那这个人就越可能是一个好人。 数学语言表达…

C# APS.NET CORE 6.0 WEB API IIS部署

1.创建 APS.NET CORE6.0 WEB API项目 默认选项即可 源代码&#xff1a; 项目文件展开&#xff1a; launchSettings.json {"$schema": "https://json.schemastore.org/launchsettings.json","iisSettings": {"windowsAuthentication"…

记录华为云服务器(Linux 可视化 宝塔面板)-- Nginx篇

文章目录 配置Nginx服务器1、添加CentOS 7系统的Nginx yum资源库2、安装Nignx服务 设置Nginx安全级别&#xff08;感觉可以先不设置&#xff09;步骤一步骤二如有启发&#xff0c;可点赞收藏哟~ 配置Nginx服务器 1、添加CentOS 7系统的Nginx yum资源库 先安装rpm apt instal…

Linux 中的 ls 命令使用教程

目录 前言 如何运用 ls 命令 1、列出带有所有权的文件和目录 2、获取以人类可读的方式显示的信息 3、列出隐藏文件 4、递归列出文件 5、在使用 ls 时对文件和目录做区分 6、列出指定扩展名的文件 7、基于大小对输出内容排序 8、根据日期和时间排序文件 让我们来总结…

Nginx:配置文件详解

一、Nginx配置文件 main配置段&#xff1a;全局配置 events段&#xff1a;定义event工作模式 http {}&#xff1a;定义http协议配置 支持使用变量&#xff1a; 内置变量&#xff1a;模块会提供内建变脸定义 自定义变量&#xff1a;set var_name value 二、 主…

动态规划学习——斐波那契数列

目录 最长的斐波那契数列子序列的长度 1.题目 2.题目接口 3.解题思路及其代码 最长的斐波那契数列子序列的长度 1.题目 如果序列x_1&#xff0c;X_2&#xff0c;...&#xff0c;x_n 满足下列条件&#xff0c;就说它是斐波那契式的: 1.n > 3 2.对于所有i2 <n&a…