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

【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 - 处理元素滚动

业务功能中时常有元素滚动的功能&#xff0c;现在就总结一下一些常用的事件。 一、定位滚动元素 做一切滚动操作之前都应该先定位到滚动元素&#xff0c;再做其他操作&#xff0c;如滚动顶部&#xff0c;获取滚动距离、禁止滚动等。 把以下代码复制粘贴到浏览器 Console 面板…...

JavaScript滚动事件

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 滚动是网页交互不可或缺的一部分。监听页面和元素的滚动事件,可以帮助…...

4.0 Zookeeper Java 客户端搭建

本教程使用的 IDE 为 IntelliJ IDEA&#xff0c;创建一个 maven 工程&#xff0c;命名为 zookeeper-demo&#xff0c;并且引入如下依赖&#xff0c;可以自行在maven中央仓库选择合适的版本&#xff0c;介绍原生 API 和 Curator 两种方式。 IntelliJ IDEA 相关介绍&#xff1a;…...

C#既然数组长度不可改变,那么如何动态调整集合类型数组大小,以便添加或删除元素?

目录 1.使用动态数组&#xff08;ArrayList&#xff09;&#xff1a; 2.使用 jagged array&#xff08;不规则数组&#xff09;&#xff1a; 3.使用 List &#xff1a; 4.使用数组复制&#xff1a; 在C#中&#xff0c;数组的长度是固定的&#xff0c;一旦声明和初始化&…...

3.1 Verilog 连续赋值

关键词&#xff1a;assign&#xff0c; 全加器 连续赋值语句是 Verilog 数据流建模的基本语句&#xff0c;用于对 wire 型变量进行赋值。&#xff1a; 格式如下 assign LHS_target RHS_expression &#xff1b; LHS&#xff08;left hand side&#xff09; 指赋值操作…...

【http】2、http request header Origin 属性、跨域 CORS、同源、nginx 反向代理、预检请求

文章目录 一、Origin 含义二、跨源资源共享&#xff1a;**Cross-Origin Resource Sharing** CORS2.1 跨域的定义2.2 功能概述2.3 场景示例2.3.1 简单请求2.3.2 Preflighted requests&#xff1a;预检请求 2.4 header2.4.1 http request header2.4.1.1 Origin2.4.1.2 Access-Con…...

LangChain pdf的读取以及向量数据库的使用

以下使用了3399.pdf&#xff0c; 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接口和服务的平台&#xff0c;促进生态系统的建设和业务拓展。本文将介绍开放平台技术架构的设计原则和实现方法&#xff0c;帮助读者了解如何构建一个稳健、安全且易于扩展的开放平台。 1. 什么是开放平台&#xff1f; - 解释了开放平台…...

飞桨自然语言处理框架 paddlenlp的 trainer

飞桨&#xff08;PaddlePaddle&#xff09;的NLP库PaddleNLP中的Trainer类是一个用于训练和评估模型的简单但功能完整的循环。它被优化用于与PaddleNLP一起使用。Trainer类简化了训练过程&#xff0c;提供了自动的批处理、模型保存、日志记录等特性。 以下是Trainer类的主要参数…...

SQL世界之命令语句Ⅲ

目录 一、SQL JOIN 1.JOIN 和 Key 2.使用 JOIN 3.不同的 SQL JOIN 二、SQL INNER JOIN 关键字 1.SQL INNER JOIN 关键字 2.INNER JOIN 关键字语法 3.内连接&#xff08;INNER JOIN&#xff09;实例 三、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&#xff0c;关于指令微调 Llama 2 的扩展说明。旨在聚焦构建指令数据集&#xff0c;有了它&#xff0c;我们则可以使用自己的指令来微调 Llama 2 基础模型。 目标是构建一个能够基于输入内容来生成指令的模型。这么做背后的逻辑是&#xff0c;模型如…...

VUE 全局设置防重复点击

请求后端防止重复点击&#xff0c;用户点击加入遮罩层&#xff0c;请求完毕关闭遮罩层 我们利用请求拦截器&#xff0c;在用户点击的时候&#xff0c;弹出遮罩层 本文采用i18n国际化 element plus UI&#xff0c;提取你想要的&#xff0c;这里不做简化 完整代码如下&#xf…...

备战蓝桥杯---动态规划(基础1)

先看几道比较简单的题&#xff1a; 直接f[i][j]f[i-1][j]f[i][j-1]即可&#xff08;注意有马的地方赋值为0&#xff09; 下面是递推循环方式实现的AC代码&#xff1a; #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协议&#xff08;因特网消息访问协议&#xff09;它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息&#xff0c;下载邮件等。它运行在TCP/IP协议之上&#xff0c;使用的端口是143。在php中调用的是imap_open函数。 PHP 的…...

Python爬虫实战:抓取猫眼电影排行榜top100#4

爬虫专栏系列&#xff1a;http://t.csdnimg.cn/Oiun0 抓取猫眼电影排行 本节中&#xff0c;我们利用 requests 库和正则表达式来抓取猫眼电影 TOP100 的相关内容。requests 比 urllib 使用更加方便&#xff0c;而且目前我们还没有系统学习 HTML 解析库&#xff0c;所以这里就…...

Fiddler抓包工具之fiddler界面工具栏介绍

Fiddler界面工具栏介绍 &#xff08;1&#xff09;WinConfig&#xff1a;windows 使用了一种叫做“AppContainer”的隔离技术&#xff0c;使得一些流量无法正常捕获&#xff0c;在 fiddler中点击 WinConfig 按钮可以解除这个诅咒&#xff0c;这个与菜单栏 Tools→Win8 Loopback…...

LabVIEW工业监控系统

LabVIEW工业监控系统 介绍了一个基于LabVIEW软件开发的工业监控系统。系统通过虚拟测控技术和先进的数据处理能力&#xff0c;实现对工业过程的高效监控&#xff0c;提升系统的自动化和智能化水平&#xff0c;从而满足现代工业对高效率、高稳定性和低成本的需求。 随着工业自…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...