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.hqwc.cn/news/221174.html

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

相关文章

C++前缀和算法:统计美丽子字符串

题目 给你一个字符串 s 和一个正整数 k 。 用 vowels 和 consonants 分别表示字符串中元音字母和辅音字母的数量。 如果某个字符串满足以下条件&#xff0c;则称其为 美丽字符串 &#xff1a; vowels consonants&#xff0c;即元音字母和辅音字母的数量相等。 (vowels * cons…

P18 C++ 继承

目录 前言 01 不使用继承会让你多打很多无用的代码 02 继承 最后的话 前言 本期我们学习 C 面向对象编程中的继承。 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#…

操作系统——解决了我的一些困惑

目录 1、电脑开机做了什么事情 2、真正实现并行的计算机 3、计算机中的淘汰算法 & 分配算法 & 调度算法 & 空间管理 4、什么是虚拟内存&#xff1f;为什么需要虚拟内存&#xff1f;最多可分配多少&#xff1f; 5、TLB&#xff08;快表&#xff09;、分页存储&…

详解RT-DETR网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署

论文地址&#xff1a;RT-DETR论文地址 代码地址&#xff1a;RT-DETR官方下载地址 目录 一、本文介绍 二、RT-DETR的网络结构 2.1、模型概览 2.2、高效混合编码器 2.3、IoU感知查询选择 2.4、 可扩展的RT-DETR 三、RT-DERT的环境搭建 四、免费数据集获取 五、获取RT-D…

【PyQt】(自定义类)阴影遮罩-升级版

这是之前发的代码(自定义类)阴影遮罩的升级版。 升级就升级在&#xff0c;优化了对非矩形控件的遮盖效果&#xff0c;例如圆角按钮&#xff0c;以及默认方法不满足时可以传入其他的遮盖方法。 自定义阴影遮罩Mask&#xff1a; class Mask(QWidget):__excludeNone__colorNonecl…

基于51单片机的信号发生器仿真设计

这里写目录标题 基于51单片机信号发生器仿真设计1 设计说明&#xff1a;2 讲解视频&#xff1a;3 仿真电路&#xff1a;程序LCD1602显示按键扫描主函数正弦波发生子程序矩形波发生子程序三角波发生子程序锯齿波发生子程序 设计说明书资料清单&&下载链接资料下载链接 基…

Android aidl的简单使用

一.服务端 1.创建aidl文件&#xff0c;然后记得build下生成java文件 package com.example.aidlservice31;// Declare any non-default types here with import statementsinterface IMyAidlServer {// 接收一个字符串参数void setData(String value);// 返回一个字符串String …

树状数组专题

折叠 区间修改&#xff0c;区间查询&#xff0c;这一类题通常都可以使用线段树解决&#xff0c;但对于此题&#xff0c;树状数组同样可以&#xff0c;而且常数较小&#xff0c;代码简单。 思路&#xff1a; 考虑使用树状数组去维护差分数组&#xff0c;即对于 a i a_i ai​,我们…

国内20个大模型中文场景测评及体验

中文场景能力测评 SuperCLUE排行榜 大模型及网站 公司&#xff08;大模型&#xff09; 智能程度 借鉴点 体验网站 备注 1 百度文心一言 高   文心一言   2 百川智能 高   百川大模型-汇聚世界知识 创作妙笔生花-百川智能   3 商汤商量SenseChat&#xff…

Rust语言入门教程(八) - 引用与借用

上一章的内容中我们讨论了Rust的所有权系统&#xff0c;当我们不想移动值的所有权时&#xff0c;我们可以使用引用和借用&#xff0c;而这正是本章想要讨论的问题。 引用&#xff08;References&#xff09; 引用允许你访问或修改数据而无需获取数据的所有权。在 Rust 中&…

论文笔记--Toolformer: Language Models Can Teach Themselves to Use Tools

论文笔记--Toolformer: Language Models Can Teach Themselves to Use Tools 1. 文章简介2. 文章概括3 文章重点技术3.1 Toolformer3.2 APIs 4. 文章亮点5. 原文传送门 1. 文章简介 标题&#xff1a;Toolformer: Language Models Can Teach Themselves to Use Tools作者&#…

鸿蒙(HarmonyOS)应用开发——装饰器

简介 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;扩展了声明式UI、状态管理等相应的能力&#xff0c;让开发者可以以更简洁、更自然的方式开发高性能应用。TS是JavaScript&#xff08;简称JS&#xff09;的超…