makefile编写练习

makefile编写练习


OVERVIEW

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

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

文件结构

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

在这里插入图片描述

#ifndef ADD_HPP
#define ADD_HPPint m_add(int a, int b);#endif //ADD_HPP
#ifndef MINUS_HPP
#define MINUS_HPPint 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/%.cppmkdir -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:=xxxI_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/%.cppmkdir -p $(dir $@)g++ -c $^ -o $@ $(compile_options) # 打包成为第三方静态库
lib/libxxx.a:$(lib_objs)mkdir -p $(dir $@)ar -r $@ $^#####################################链接静态库
# 编译
objs/main.o:src/main.cppmkdir -p $(dir $@)g++ -c $^ -o $@ $(compile_options)# 链接静态库
run/exec:objs/main.omkdir -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:=xxxI_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/%.cppmkdir -p $(dir $@)g++ -c $^ -o $@ $(compile_options) # 打包成为第三方动态库
lib/libxxx.so:$(lib_objs)mkdir -p $(dir $@)g++ -shared $^ -o $@#####################################链接动态库
# 编译
objs/main.o:src/main.cppmkdir -p $(dir $@)g++ -c $^ -o $@ $(compile_options)# 链接动态库
run/exec:objs/main.omkdir -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.mzph.cn/news/171390.shtml

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

相关文章

乘波前行的问题

1.问题&#xff1a; 考虑两个信号叠加在一起&#xff0c;比如&#xff0c;一个是工频信号50Hz&#xff0c;一个是叠加的高频信号比如有3KHz&#xff0c;简单起见&#xff0c;两个信号都是幅值固定的标准的正弦波&#xff0c;现在我们期望得到那个高频信号&#xff0c;相对工频…

Royal TSX v6.0.1

Royal TSX是一款基于插件的软件&#xff0c;适用于Windows系统&#xff0c;可以用于远程连接和管理服务器。它支持多种连接类型&#xff0c;如RDP、VNC、基于SSH连接的终端&#xff0c;SFTP/FTP/SCP或基于Web的连接管理。 在安装Royal TSX后&#xff0c;需要进行一些基础配置&…

如何停止输出“下载存储库‘rhel-8-for-x86_64-appstream-rpms’元数据时出错”错误?

问题 dnf[XXX]&#xff1a;下载存储库“rhel-8-for-x86_64-appstream-rpms”元数据时出错&#xff1a;如何禁用 dnf-makecache&#xff1f; 解决 离线系统无法下载元数据存储库&#xff0c;然后输出错误。 有两种方法可以阻止错误。 A) 在 /etc/dnf/dnf.conf 中添加以下行。…

C++中声明友元

C中声明友元 不能从外部访问类的私有数据成员和方法&#xff0c;但这条规则不适用于友元类和友元函数。要声明友元 类或友元函数&#xff0c;可使用关键字 friend&#xff0c;如以下示例程序所示&#xff1a; 使用关键字 friend 让外部函数 DisplayAge( )能够访问私有数据成员…

2023人形机器人行业海外科技研究:从谷歌看机器人大模型进展

今天分享的是人形机器人系列深度研究报告&#xff1a;《2023人形机器人行业海外科技研究&#xff1a;从谷歌看机器人大模型进展》。 &#xff08;报告出品方&#xff1a;华鑫证券&#xff09; 报告共计&#xff1a;26页 大模型是人形机器人的必备要素 长期来看&#xff0c;人…

openEuler 22.03 LTS x86_64 cephadm 部署ceph 16.2.14 未完成 笔记

环境 准备三台虚拟机 10.47.76.94 node-1 10.47.76.95 node-2 10.47.76.96 node-3 下载cephadm [rootnode-1 ~]# yum install cephadm Last metadata expiration check: 0:11:31 ago on Tue 21 Nov 2023 10:00:20 AM CST. Dependencies resolved. Package …

数据结构(超详细讲解!!)第二十五节 线索二叉树

1.线索二叉树的定义和结构 问题的提出&#xff1a; 通过遍历二叉树可得到结点的一个线性序列&#xff0c;在线性序列中&#xff0c;很容易求得某个结点的直接前驱和后继。但是在二叉树上只能找到结点的左孩子、右孩子&#xff0c;结点的前驱和后继只有在遍历过程中才能得到…

Python与设计模式--策略模式

12-Python与设计模式–策略模式 一、客户消息通知 假设某司维护着一些客户资料&#xff0c;需要在该司有新产品上市或者举行新活动时通知客户。现通知客户的方式有两 种&#xff1a;短信通知、邮件通知。应如何设计该系统的客户通知部分&#xff1f;为解决该问题&#xff0c;…

Alfred v5.1.4(mac快速启动)

Mac效率办公软件哪个好&#xff1f;Alfred是一款Mac电脑上的快速启动和工作流自动化工具&#xff0c;它可以帮助用户快速访问文件、应用程序、web搜索和系统工具&#xff0c;提高工作效率。以下是Alfred的特点&#xff1a; 快速启动&#xff1a;用户可以通过Alfred快速启动应用…

Node.js入门指南(四)

目录 express框架 express介绍 express使用 express路由 express 响应设置 中间件 路由模块化 EJS 模板引擎 express-generator hello&#xff0c;大家好&#xff01;上一篇文章我们介绍了Node.js的模块化以及包管理工具等知识&#xff0c;这篇文章主要给大家分享Nod…

Hive删除符合条件的记录

Hive在使用中不支持update和delete操作&#xff0c;那么如果想删除部分条件的记录需要怎么操作&#xff1f;本文记录下解决方法。 思路&#xff1a;使用selectwhere选出想要保留的数据&#xff0c;使用insert overwrite向原表覆盖插入数据. insert overwrite table dbname.tab…

车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体)

车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都…

(2023码蹄杯)省赛(初赛)第三场真题(原题)(题解+AC代码)

题目1&#xff1a;MC0227堆煤球 码题集OJ-堆煤球 (matiji.net) 思路&#xff1a; 1.i从l枚举到r,i是8的倍数就跳过&#xff0c;i不是8的倍数就用等差数列求和公式i(1i)/2,最后累加到答案中即可 AC_Code:C #include<bits/stdc.h> using namespace std;int main( ) {in…

使用el-scrollbar实现定位滚动,以及el-scrollbar去掉横向滚动条

实现滚动 <el-scrollbar ref"scroll" style"height: 100%;">// ... </el-scrollbar>可以使用如下属性&#xff1a; this.$refs[scroll].wrap.scrollTop 0 //想滚到哪个高度&#xff0c;就写多少el-scrollbar去掉横向滚动条 ::v-deep .el-…

轻松实现文件按数量平均分类,高效整理并自动新建文件夹保存“

你是否曾经因为文件数量过多&#xff0c;整理起来繁琐而感到烦恼&#xff1f;是否曾经为了新建文件夹而手动一个一个进行创建&#xff0c;费时又费力&#xff1f;现在&#xff0c;我们的智能文件管理工具将为你解决这些问题&#xff01; 首先第一步&#xff0c;我们要进入文件…

【开源】基于Vue.js的网上药店系统

项目编号&#xff1a; S 062 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S062&#xff0c;文末获取源码。} 项目编号&#xff1a;S062&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药…

聊一聊索引覆盖的好处

问&#xff1a;索引覆盖啥意思&#xff1f; 答&#xff1a;若查询的字段在二级索引的叶子节点中&#xff0c;则可直接返回结果&#xff0c;无需回表。这种通过组合索引避免回表的优化技术也称为索引覆盖&#xff08;Covering Index&#xff09;。在叶子节点中的包括索引字段和主…

力扣-55.跳跃游戏

思路&#xff1a; 每次移动一步&#xff0c;就更新最大覆盖范围。然后用cnt记录每次能移动最大范围的步数。如果最大范围能覆盖数组长度&#xff0c;则可以跳跃到末尾。 class Solution { public:bool canJump(vector<int>& nums) {int cnt 0;for(int i 0; i <…

acwing算法基础之数学知识--容斥原理

目录 1 基础知识2 模板3 工程化 1 基础知识 题目描述&#xff1a;给定整数n和m个不同的质数&#xff0c;p1,p2,…pm&#xff0c;求1~n中能被这m个质数中至少一个质数整除的数有多少个。其中n和 p i p_i pi​在 1 0 9 10^9 109以内&#xff0c;而m在16以内。 容斥原理&#xf…

DataGrip 2023.2.3(IDE数据库开发)

DataGrip是一款数据库集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于数据库管理和开发。 DataGrip提供了许多强大的功能&#xff0c;如SQL语句编辑、数据库连接管理、数据导入和导出、数据库比较和同步等等。它支持多种数据库&#xff0c;如MySQL、PostgreSQL、Ora…