【Makefile语法 05】动静态库编译链接
目录
一、多文件项目源代码
二、静态库编译链接
三、动态库编译链接
一、多文件项目源代码
// include/add.hpp#pragma once
int add(int a, int b);
// include/sub.hpp#pragma once
int sub(int a, int b);
// src/add.cpp#include "add.hpp"int add(int a, int b) {return a + b;
}
// src/sub.cpp#include "sub.hpp"int sub(int a, int b) {return a - b;
}
// src/main.cpp#include <iostream>
#include "add.hpp"
#include "sub.hpp"int main() {std::cout << "10 + 5 = " << add(10, 5) << std::endl;std::cout << "10 - 5 = " << sub(10, 5) << std::endl;return 0;
}
二、静态库编译链接
# Makefile文件lib_srcs := $(filter-out src/main.cpp,$(shell find src -name *.cpp))
lib_objs := $(patsubst src/%.cpp,obj/%.o, $(lib_srcs))include_paths := $(shell pwd)/include/library_paths := $(shell pwd)/lib/
library_names := mymathI_options := $(include_paths:%=-I%)
l_options := $(library_names:%=-l%)
L_options := $(library_paths:%=-L%)compile_flags := $(I_options) -w -O3 -std=c++11
linking_flags := $(l_options) $(L_options)# ================ 编译静态库 ===============obj/%.o : src/%.cppg++ -c $^ -o $@ $(compile_flags)lib/libmymath.a : $(lib_objs)@mkdir -p $(dir $@)ar -r $@ $^static_lib : lib/libmymath.a# ================ 链接静态库 ===============obj/main.o : src/main.cpp@mkdir -p $(dir $@)g++ -c $^ -o $@ $(compile_flags)workspace/math.exe : obj/main.o@mkdir -p $(dir $@)g++ $^ -o $@ $(linking_flags)# ================ 运行与测试 ===============run : workspace/math.exe@./$<test :@echo "lib_srcs: " $(lib_srcs)@echo "lib_objs: " $(lib_objs)@echo "include_paths: " $(include_paths)@echo "compile_opts: " $(compile_opts)clean:rm -rf obj/* workspace .PHONY: test clean run
# 静态库编译链接过程(base) [root@localhost 08_test]# tree .
.
├── include
│ ├── add.hpp
│ └── sub.hpp
├── makefile
├── obj
└── src├── add.cpp├── main.cpp└── sub.cpp3 directories, 6 files
(base) [root@localhost 08_test]# make static_lib
g++ -c src/add.cpp -o obj/add.o -I/root/gitee/Test/Make_Learn/08_test/include/ -w -O3 -std=c++11
g++ -c src/sub.cpp -o obj/sub.o -I/root/gitee/Test/Make_Learn/08_test/include/ -w -O3 -std=c++11
ar -r lib/libmymath.a obj/add.o obj/sub.o
ar: 正在创建 lib/libmymath.a
(base) [root@localhost 08_test]# tree .
.
├── include
│ ├── add.hpp
│ └── sub.hpp
├── lib
│ └── libmymath.a
├── makefile
├── obj
│ ├── add.o
│ └── sub.o
└── src├── add.cpp├── main.cpp└── sub.cpp4 directories, 9 files
(base) [root@localhost 08_test]# make run
g++ -c src/main.cpp -o obj/main.o -I/root/gitee/Test/Make_Learn/08_test/include/ -w -O3 -std=c++11
g++ obj/main.o -o workspace/math.exe -lmymath -L/root/gitee/Test/Make_Learn/08_test/lib/
10 + 5 = 15
10 - 5 = 5
(base) [root@localhost 08_test]# tree .
.
├── include
│ ├── add.hpp
│ └── sub.hpp
├── lib
│ └── libmymath.a
├── makefile
├── obj
│ ├── add.o
│ ├── main.o
│ └── sub.o
├── src
│ ├── add.cpp
│ ├── main.cpp
│ └── sub.cpp
└── workspace└── math.exe5 directories, 11 files
(base) [root@localhost 08_test]#
三、动态库编译链接
# Makefile文件lib_srcs := $(filter-out src/main.cpp,$(shell find src -name *.cpp))
lib_objs := $(patsubst src/%.cpp,obj/%.o, $(lib_srcs))include_paths := $(shell pwd)/include/library_paths := $(shell pwd)/lib/
library_names := mymathI_options := $(include_paths:%=-I%)
l_options := $(library_names:%=-l%)
L_options := $(library_paths:%=-L%)compile_flags := $(I_options) -w -O3 -std=c++11 -fpic
linking_flags := $(l_options) $(L_options)# ================ 编译动态库 ===============obj/%.o : src/%.cppg++ -c $^ -o $@ $(compile_flags)lib/libmymath.so : $(lib_objs)@mkdir -p $(dir $@)g++ -shared $^ -o $@shared_lib : lib/libmymath.so# ================ 链接动态库 ===============obj/main.o : src/main.cpp@mkdir -p $(dir $@)g++ -c $^ -o $@ $(compile_flags)workspace/math.exe : obj/main.o@mkdir -p $(dir $@)ln -s $(library_paths)/libmymath.so /lib64/libmymath.sog++ $^ -o $@ $(linking_flags)# ================ 运行与测试 ===============run : workspace/math.exe@./$<test :@echo "lib_srcs: " $(lib_srcs)@echo "lib_objs: " $(lib_objs)@echo "include_paths: " $(include_paths)@echo "compile_opts: " $(compile_opts)clean:rm -rf obj/* workspace lib /lib64/libmymath.so.PHONY: test clean run
# 动态库编译链接过程(base) [root@localhost 09_test]# tree .
.
├── include
│ ├── add.hpp
│ └── sub.hpp
├── makefile
├── obj
└── src├── add.cpp├── main.cpp└── sub.cpp3 directories, 6 files
(base) [root@localhost 09_test]# make shared_lib
g++ -c src/add.cpp -o obj/add.o -I/root/gitee/Test/Make_Learn/09_test/include/ -w -O3 -std=c++11 -fpic
g++ -c src/sub.cpp -o obj/sub.o -I/root/gitee/Test/Make_Learn/09_test/include/ -w -O3 -std=c++11 -fpic
g++ -shared obj/add.o obj/sub.o -o lib/libmymath.so
(base) [root@localhost 09_test]# make run
g++ -c src/main.cpp -o obj/main.o -I/root/gitee/Test/Make_Learn/09_test/include/ -w -O3 -std=c++11 -fpic
ln -s /root/gitee/Test/Make_Learn/09_test/lib//libmymath.so /lib64/libmymath.so
g++ obj/main.o -o workspace/math.exe -lmymath -L/root/gitee/Test/Make_Learn/09_test/lib/
10 + 5 = 15
10 - 5 = 5
(base) [root@localhost 09_test]# tree .
.
├── include
│ ├── add.hpp
│ └── sub.hpp
├── lib
│ └── libmymath.so
├── makefile
├── obj
│ ├── add.o
│ ├── main.o
│ └── sub.o
├── src
│ ├── add.cpp
│ ├── main.cpp
│ └── sub.cpp
└── workspace└── math.exe5 directories, 11 files
(base) [root@localhost 09_test]#
相关文章:
【Makefile语法 05】动静态库编译链接
目录 一、多文件项目源代码 二、静态库编译链接 三、动态库编译链接 一、多文件项目源代码 // include/add.hpp#pragma once int add(int a, int b); // include/sub.hpp#pragma once int sub(int a, int b); // src/add.cpp#include "add.hpp"int add(int a, …...
JS - 处理元素滚动
业务功能中时常有元素滚动的功能,现在就总结一下一些常用的事件。 一、定位滚动元素 做一切滚动操作之前都应该先定位到滚动元素,再做其他操作,如滚动顶部,获取滚动距离、禁止滚动等。 把以下代码复制粘贴到浏览器 Console 面板…...
JavaScript滚动事件
🧑🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ✨ 前言 滚动是网页交互不可或缺的一部分。监听页面和元素的滚动事件,可以帮助…...
4.0 Zookeeper Java 客户端搭建
本教程使用的 IDE 为 IntelliJ IDEA,创建一个 maven 工程,命名为 zookeeper-demo,并且引入如下依赖,可以自行在maven中央仓库选择合适的版本,介绍原生 API 和 Curator 两种方式。 IntelliJ IDEA 相关介绍:…...
C#既然数组长度不可改变,那么如何动态调整集合类型数组大小,以便添加或删除元素?
目录 1.使用动态数组(ArrayList): 2.使用 jagged array(不规则数组): 3.使用 List : 4.使用数组复制: 在C#中,数组的长度是固定的,一旦声明和初始化&…...
3.1 Verilog 连续赋值
关键词:assign, 全加器 连续赋值语句是 Verilog 数据流建模的基本语句,用于对 wire 型变量进行赋值。: 格式如下 assign LHS_target RHS_expression ; LHS(left hand side) 指赋值操作…...
【http】2、http request header Origin 属性、跨域 CORS、同源、nginx 反向代理、预检请求
文章目录 一、Origin 含义二、跨源资源共享:**Cross-Origin Resource Sharing** CORS2.1 跨域的定义2.2 功能概述2.3 场景示例2.3.1 简单请求2.3.2 Preflighted requests:预检请求 2.4 header2.4.1 http request header2.4.1.1 Origin2.4.1.2 Access-Con…...
LangChain pdf的读取以及向量数据库的使用
以下使用了3399.pdf, Rockchip RK3399 TRM Part1 import ChatGLM from langchain.chains import LLMChain from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain.chains import Simp…...
VUE学习——事件修饰符
阻止默认事件 <template><a click"onClickHandle" href"https://www.baidu.com">baidu</a><a click.prevent"onClickHandle" href"https://www.baidu.com">baidu</a> </template> <script>…...
开放平台技术架构设计与实现的实战总结
开放平台是企业向外部开发者提供API接口和服务的平台,促进生态系统的建设和业务拓展。本文将介绍开放平台技术架构的设计原则和实现方法,帮助读者了解如何构建一个稳健、安全且易于扩展的开放平台。 1. 什么是开放平台? - 解释了开放平台…...
飞桨自然语言处理框架 paddlenlp的 trainer
飞桨(PaddlePaddle)的NLP库PaddleNLP中的Trainer类是一个用于训练和评估模型的简单但功能完整的循环。它被优化用于与PaddleNLP一起使用。Trainer类简化了训练过程,提供了自动的批处理、模型保存、日志记录等特性。 以下是Trainer类的主要参数…...
SQL世界之命令语句Ⅲ
目录 一、SQL JOIN 1.JOIN 和 Key 2.使用 JOIN 3.不同的 SQL JOIN 二、SQL INNER JOIN 关键字 1.SQL INNER JOIN 关键字 2.INNER JOIN 关键字语法 3.内连接(INNER JOIN)实例 三、SQL LEFT JOIN 关键字 1.SQL LEFT JOIN 关键字 2.LEFT JOIN 关…...
Snoop Version 2 Packet Capture File Format
RFC1761 - Snoop Version 2 Packet Capture File Format, FEBRUARY 1995 本备忘录的状态 本备忘录为互联网社区提供帮助信息。 本备忘录不作为任何类型的互联网标准。 本备忘录的分发不受限制。 Status of this Memo This memo provides information for the Internet communit…...
扩展说明: 指令微调 Llama 2
这篇博客是一篇来自 Meta AI,关于指令微调 Llama 2 的扩展说明。旨在聚焦构建指令数据集,有了它,我们则可以使用自己的指令来微调 Llama 2 基础模型。 目标是构建一个能够基于输入内容来生成指令的模型。这么做背后的逻辑是,模型如…...
VUE 全局设置防重复点击
请求后端防止重复点击,用户点击加入遮罩层,请求完毕关闭遮罩层 我们利用请求拦截器,在用户点击的时候,弹出遮罩层 本文采用i18n国际化 element plus UI,提取你想要的,这里不做简化 完整代码如下…...
备战蓝桥杯---动态规划(基础1)
先看几道比较简单的题: 直接f[i][j]f[i-1][j]f[i][j-1]即可(注意有马的地方赋值为0) 下面是递推循环方式实现的AC代码: #include<bits/stdc.h> using namespace std; #define int long long int a[30][30]; int n,m,x,y; …...
CVE-2018-19518 漏洞复现
CVE-2018-19518 漏洞介绍 IMAP协议(因特网消息访问协议)它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。它运行在TCP/IP协议之上,使用的端口是143。在php中调用的是imap_open函数。 PHP 的…...
Python爬虫实战:抓取猫眼电影排行榜top100#4
爬虫专栏系列:http://t.csdnimg.cn/Oiun0 抓取猫眼电影排行 本节中,我们利用 requests 库和正则表达式来抓取猫眼电影 TOP100 的相关内容。requests 比 urllib 使用更加方便,而且目前我们还没有系统学习 HTML 解析库,所以这里就…...
Fiddler抓包工具之fiddler界面工具栏介绍
Fiddler界面工具栏介绍 (1)WinConfig:windows 使用了一种叫做“AppContainer”的隔离技术,使得一些流量无法正常捕获,在 fiddler中点击 WinConfig 按钮可以解除这个诅咒,这个与菜单栏 Tools→Win8 Loopback…...
LabVIEW工业监控系统
LabVIEW工业监控系统 介绍了一个基于LabVIEW软件开发的工业监控系统。系统通过虚拟测控技术和先进的数据处理能力,实现对工业过程的高效监控,提升系统的自动化和智能化水平,从而满足现代工业对高效率、高稳定性和低成本的需求。 随着工业自…...
从零到一:HNU计算机系统实验原型机vspm1.0实战与miniCC编译初探
1. 初识HNU计算机系统实验原型机vspm1.0 第一次接触vspm1.0原型机时,我完全被这个精巧的教学工具吸引了。作为一个计算机系统初学者,最让我惊喜的是它用不到200行汇编指令就完整模拟了冯诺伊曼体系结构的核心要素。这台原型机配备了6个通用寄存器&#x…...
FreeCAD+AI实战:手把手教你用CAD-Assistant自动生成3D模型(附避坑指南)
FreeCADAI实战:手把手教你用CAD-Assistant自动生成3D模型(附避坑指南) 在传统CAD设计流程中,从手绘草图到可编辑的3D模型往往需要经历繁琐的描线、约束添加和参数调整。CAD-Assistant的出现彻底改变了这一局面——这款基于工具增强…...
收藏!小白程序员必备:轻松入门大模型智能体架构的六种设计模式
收藏!小白程序员必备:轻松入门大模型智能体架构的六种设计模式 本文介绍了大模型智能体的六种设计模式,包括单智能体、网络、监督者、工具化监督者、层级和自定义工作流模式。多智能体系统通过职责分配解决了单智能体扩展性问题,提…...
论文党救星!Paperxie:用 AI 搞定本科毕设的绘图 / 排版 / AI 率三大难题
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 谁懂啊家人们!本科毕业论文简直是大学生涯的 “终极渡劫”—— 选题卡壳、文献找不到、图表画到崩溃、…...
告别手动处理!用HyP3+MintPy+ERA5自动化搞定Sentinel-1时序形变分析(保姆级避坑指南)
从零构建Sentinel-1时序形变分析自动化流水线:HyP3MintPyERA5实战手册 当传统InSAR分析流程需要耗费数周时间手动处理数据时,我们如何通过云端服务与开源工具的组合实现效率的指数级提升?本文将揭示一套经过实战检验的自动化解决方案…...
RuoYi-Vue-Plus:企业级应用开发的现代化技术框架
RuoYi-Vue-Plus:企业级应用开发的现代化技术框架 【免费下载链接】RuoYi-Vue-Plus 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus 一、价值定位:重新定义企业级开发标准 1 架构突破:插件化设计的实践价值 在传…...
nli-distilroberta-base新手指南:理解Entailment/Contradiction/Neutral三分类输出含义
nli-distilroberta-base新手指南:理解Entailment/Contradiction/Neutral三分类输出含义 1. 项目介绍 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)服务,专门用于分析两个句子之间的关系。这个轻量级模型能够快速判断句子对之…...
AI智能体开发实战指南:从架构设计到生态拓展
AI智能体开发实战指南:从架构设计到生态拓展 【免费下载链接】ai-agents-for-beginners 这个项目是一个针对初学者的 AI 代理课程,包含 10 个课程,涵盖构建 AI 代理的基础知识。源项目地址:https://github.com/microsoft/ai-agent…...
智能体架构与任务自动化:Agent-S框架技术解析与实战指南
智能体架构与任务自动化:Agent-S框架技术解析与实战指南 【免费下载链接】Agent-S Agent S: an open agentic framework that uses computers like a human 项目地址: https://gitcode.com/GitHub_Trending/ag/Agent-S 智能体架构正在重塑自动化任务处理的未…...
Llama-3.2V-11B-cot教程:如何评估图文对齐质量与推理链可信度
Llama-3.2V-11B-cot教程:如何评估图文对齐质量与推理链可信度 1. 认识Llama-3.2V-11B-cot模型 Llama-3.2V-11B-cot是一个融合了视觉理解和逻辑推理能力的多模态模型。它不仅能看懂图片内容,还能像人类一样进行逐步推理,最终得出合理结论。这…...
