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

C++ 中的静态链接和动态链接详解

目录

一、什么是链接?

链接分为两类:

二、静态链接(Static Linking)

 特点:

 优点:

 缺点:

 使用方式:

三、动态链接(Dynamic Linking)

特点:

优点:

缺点:

使用方式:

四、简单示例演示

Step 1: 创建头文件和实现文件

Step 2: 编译静态库

Step 3: 编译动态库

五、如何选择静态或动态链接?

六、混合使用?

七、安全注意事项

八、总结


C++ 是一门非常强调性能的系统级语言,而链接方式(静态 or 动态)在项目构建中起着至关重要的作用。理解它们不仅能帮助你优化程序体积、启动速度,还能在大型项目中实现模块化部署。

一、什么是链接?

链接(Linking)是 C++ 编译过程的最后一步。它的作用是将多个**目标文件(.o/.obj)库文件(.a/.so/.lib/.dll)**整合成一个可执行文件。

链接分为两类:

链接方式说明文件后缀
静态链接编译期将库代码嵌入程序.a(Linux)、.lib(Windows)
动态链接程序运行时加载共享库.so(Linux)、.dll(Windows)

二、静态链接(Static Linking)

 特点:

  • 链接时,库的代码被复制到可执行文件中。

  • 程序运行时不再依赖外部库文件。

  • 整个程序是一个完整的整体。

 优点:

  • 程序部署更简单,不需要额外的库文件。

  • 启动速度快:不需要动态加载。

  • 发布时不暴露源码和库结构。

 缺点:

  • 可执行文件变大,嵌入了库的所有代码。

  • 所有使用该库的程序都各自保存一份副本,内存冗余

  • 更新库需要重新编译所有相关程序

 使用方式:

g++ main.cpp -o app -L./lib -lmylib_static
假设你有 libmylib_static.a,它会在编译时被打包到 app 中。

三、动态链接(Dynamic Linking)

特点:

  • 在编译时只记录库的引用地址,不复制库代码。

  • 程序启动或运行时动态加载 .so / .dll

  • 所有程序共享同一份动态库。

优点:

  • 可执行文件体积小。

  • 不同程序共享同一份库,节省内存。

  • 动态库升级不需要重新编译应用程序

缺点:

  • 部署复杂:程序需要依赖外部 .so/.dll

  • 程序启动慢:运行时需要加载库。

  • 如果库版本不兼容,可能会出现“动态链接地狱”(常见于 Linux)。

使用方式:

g++ main.cpp -o app -L./lib -lmylib_shared

 假设你有 libmylib_shared.so,运行时需要设置库路径:

export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
./app

四、简单示例演示

Step 1: 创建头文件和实现文件

mylib.h

#pragma once
void say_hello();

 mylib.cpp

#include <iostream>
void say_hello() {std::cout << "Hello from mylib!" << std::endl;
}

main.cpp

#include "mylib.h"
int main() {say_hello();return 0;
}

Step 2: 编译静态库

g++ -c mylib.cpp -o mylib.o
ar rcs libmylib_static.a mylib.o
g++ main.cpp -L. -lmylib_static -o app_static

 运行:

./app_static

Step 3: 编译动态库

g++ -fPIC -shared mylib.cpp -o libmylib_shared.so
g++ main.cpp -L. -lmylib_shared -o app_shared

 运行:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./app_shared

五、如何选择静态或动态链接?

场景推荐方式
需要独立分发的可执行程序静态链接
对性能和资源优化要求高动态链接
需要频繁更新库或插件的系统动态链接
内部使用、无需部署复杂性控制静态链接
插件化架构(如游戏引擎)动态链接

六、混合使用?

可以。一个程序可以同时使用多个静态库和动态库。例如:

  • libA.a 静态库

  • libB.so 动态库

只要链接顺序正确,编译器会处理得当。但注意版本冲突问题。

七、安全注意事项

  • 动态库路径要谨慎配置,避免被恶意替换(可用 rpathLD_LIBRARY_PATH 控制)。

  • 使用 strip 工具去除无用调试符号,降低体积泄露风险。

  • 静态链接能更好地防止逆向分析(但不是绝对安全)。

八、总结

项目静态链接动态链接
文件体积
启动速度稍慢
内存占用少(共享库)
升级维护不方便方便
安装部署简单(只有一个文件)需要一同部署动态库
适用场景独立部署,发布发布发布!插件、共享库、多程序共用模块

相关文章:

C++ 中的静态链接和动态链接详解

目录 一、什么是链接&#xff1f; 链接分为两类&#xff1a; 二、静态链接&#xff08;Static Linking&#xff09; 特点&#xff1a; 优点&#xff1a; 缺点&#xff1a; 使用方式&#xff1a; 三、动态链接&#xff08;Dynamic Linking&#xff09; 特点&#xff1a; 优…...

426、N叉树的层序遍历

输入检查&#xff1a; if not root:return [] 如果根节点为空&#xff0c;直接返回空列表 初始化&#xff1a; result [] queue collections.deque([root]) result用于存储最终结果queue初始化包含根节点&#xff0c;使用双端队列实现 主循环&#xff1a; while queue:leve…...

雅思阅读--重点短语/句式39个

文章目录 1. according to2. regardless of3. make/keep/leave + n. + adj.leave us stronger1. according to “according to(根据)”。 德国著名数学家 David Hilbert(大卫希尔伯特)说过: Mathematics is a game played according to certain simple rules with meanin…...

探索开源大模型体系:当今AI的引领者

目录 1. Hugging Face Transformers 2. OpenAI GPT 3. DeepSpeed 4. Megatron-LM 5. AllenNLP 总结 在当今人工智能的迅猛发展中&#xff0c;大模型&#xff08;Large Model&#xff09;已经成为了AI领域的核心。与传统的机器学习模型相比&#xff0c;大模型在自然语言处…...

n8n系列(1)初识n8n:工作流自动化平台概述

1. 引言 随着各类自动化工具的涌现,n8n作为一款开源的工作流自动化平台,凭借其灵活性、可扩展性和强大的集成能力,正在获得越来越多技术团队的青睐。 本文作为n8n系列的开篇,将带您全面了解这个强大的自动化平台,探索其起源、特性以及与其他工具的差异,帮助您判断n8n是否…...

n8n 与智能体构建:开发自动化 AI 作业的基础平台

n8n 是一款开源的自动化流程构建平台&#xff0c;通过其模块化节点系统&#xff0c;开发者可以快速实现跨平台的任务编排、数据集成与智能交互。当 n8n 与大型语言模型&#xff08;LLM&#xff09;结合时&#xff0c;就能构建出具备感知、推理、执行能力的 AI 智能体&#xff0…...

大模型主干

1.什么是语言模型骨架LLM-Backbone,在多模态模型中的作用&#xff1f; 语言模型骨架&#xff08;LLM Backbone&#xff09;是多模态模型中的核心组件之一。它利用预训练的语言模型&#xff08;如Flan-T5、ChatGLM、UL2等&#xff09;来处理各种模态的特征&#xff0c;进行语义…...

大模型在宫颈癌诊疗全流程预测与应用研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测宫颈癌术前风险 2.1 术前数据收集与预处理 2.2 预测模型构建与算法选择 2.3 术前风险预测指标与案例分析 三、大模型辅助制定术中方案 3.1 术中风险动态监测与预测 3.2 基于预测的手术方案优化…...

Diffusion Transformer(DiT)

扩散模型的核心思想&#xff1a;Diffusion Models是一种受到非平衡热力学启发的生成模型&#xff0c;其核心思想是通过模拟扩散过程来逐步添加噪声到数据中&#xff0c;并随后学习反转这个过程以从噪声中构建出所需的数据样本。 DiT的架构&#xff1a;DiT架构基于Latent Diffu…...

多模态理论知识

说一下多模态的定义? 多模态是指使用多种不同类型的媒体和数据输入&#xff0c;例如文本、图像、音频、视频等&#xff0c;它们之间存在关联或者对应关系。 这些不同类型的媒体和数据输入可以在不同的层面上传达信息并表达意义。多模态数据的处理需要融合不同类型的信息&…...

Nginx 安全防护与HTTPS部署

目录 一、核心安全配置 1、隐藏版本号 2、限制危险请求方法 3、请求限制&#xff08;CC攻击防御&#xff09; &#xff08;1&#xff09;使用Nginx的limit_req模块限制请求速率 &#xff08;2&#xff09;压力测试验证 4、防盗链 &#xff08;1&#xff09;修改 Window…...

Python爬虫+代理IP+Header伪装:高效采集亚马逊数据

1. 引言 在当今大数据时代&#xff0c;电商平台&#xff08;如亚马逊&#xff09;的数据采集对于市场分析、竞品监控和价格追踪至关重要。然而&#xff0c;亚马逊具有严格的反爬虫机制&#xff0c;包括IP封禁、Header检测、验证码挑战等。 为了高效且稳定地采集亚马逊数据&am…...

效率提升利器:解锁图片处理新姿势

今天我给大家分享一款超实用的图片压缩软件&#xff0c;好用程度超出想象&#xff01;该软件身形 “轻盈”&#xff0c;仅 648KB&#xff0c;启动后能迅速上手。 01 软件介绍 这款软件就是PicSizer&#xff0c;具有以下特点&#xff1a; 支持windows系统 体积小&#xff0c;绿…...

【强化学习】什么是强化学习?2025

1. 强化学习简介 一句话总结&#xff1a;强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种机器学习范式&#xff0c;强调智能体&#xff08;agent&#xff09;通过与环境&#xff08;environment&#xff09;的交互&#xff0c;以试错&#xff08;trial‑an…...

富文本编辑器的第三方库ProseMirror

如果0-1的开发一个富文本编辑器&#xff0c;成本还是非常高的&#xff0c;里面很多坑要踩&#xff0c;市面上很多库可以帮助我们搭建一个富文本编辑器&#xff0c;ProseMirror就是其中最流行的库之一。 认识ProseMirror ProseMirror 提供了一套工具和概念&#xff0c;用于构建…...

理解IP四元组与网络五元组:网络流量的“身份证”

理解IP四元组与网络五元组&#xff1a;网络流量的“身份证” 在现代网络通信中&#xff0c;IP四元组和网络五元组是流量识别、连接追踪、安全策略等核心的基础概念。理解这些“元组”不仅能够帮助我们更好地设计网络架构、排查故障&#xff0c;还能为安全与运维策略的落地提供…...

ROS2:话题通信CPP语法速记

目录 发布方实现流程重点代码 订阅方实现流程重点代码 参考代码示例发布方代码订阅方代码 发布方实现流程 包含头文件&#xff08;rclcpp.hpp与[interfaces_pkg].hpp&#xff09;初始化ROS2客户端&#xff08;rclcpp::init&#xff09;自定义节点类(创建发布实例&#xff0c;伺…...

码蹄集——直线切平面、圆切平面

MT1068 直线切平面 思路&#xff1a; 则 #include<bits/stdc.h> using namespace std;int main( ) {int n;cin>>n;cout<<n*(n1)/21;return 0; } MT1069圆切平面 n个圆最多把平面分成几部分&#xff1f;输入圆的数量N&#xff0c;问最多把平面分成几块。比如…...

2025年游戏行业DDoS攻防指南:智能防御体系构建与实战策略

2025年&#xff0c;游戏行业在全球化扩张与技术创新浪潮中&#xff0c;正面临前所未有的DDoS攻击威胁。攻击规模从T级流量到AI驱动的精准渗透&#xff0c;攻击手段从传统网络层洪水到混合型应用层打击&#xff0c;防御体系已从“被动应对”转向“智能博弈”。本文将结合最新攻击…...

LightGBM算法原理及Python实现

一、概述 LightGBM 由微软公司开发&#xff0c;是基于梯度提升框架的高效机器学习算法&#xff0c;属于集成学习中提升树家族的一员。它以决策树为基学习器&#xff0c;通过迭代地训练一系列决策树&#xff0c;不断纠正前一棵树的预测误差&#xff0c;逐步提升模型的预测精度&a…...

Nvidia发布Parakeet V2,一款新的开源自动语音识别模型

Nvidia 发布 Parakeet V2&#xff0c;一款新的开源自动语音识别 AI&#xff0c;核心亮点&#xff1a;一秒钟转录一小时的音频&#xff1b;Open ASR 上的顶级模型&#xff0c;击败了 ElevenLabs 的 Scribe 和 OpenAI 的 Whisper&#xff1b;6.05% 的单词错误率&#xff1b;CC-BY…...

浅析MySQL 的 **触发器(Trigger)** 和 **存储过程(Stored Procedure)原理及优化建议

MySQL 的 触发器(Trigger) 和 存储过程(Stored Procedure) 是数据库中用于实现业务逻辑的重要机制,它们的原理和使用方式不同,适用于不同的场景。 一、基本概念与原理 特性触发器(Trigger)存储过程(Stored Procedure)定义在表上定义,当特定事件(INSERT/UPDATE/DELE…...

网页版部署MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南

1. 安装MySQL和PyMySQL 安装MySQL # 在Ubuntu/Debian上安装 sudo apt update sudo apt install mysql-server sudo mysql_secure_installation# 启动MySQL服务 sudo systemctl start mysql sudo systemctl enable mysql 安装PyMySQL pip install pymysql 使用 apt 安装 My…...

人工智能与智能合约:如何用AI优化区块链技术中的合约执行?

引言&#xff1a;科技融合的新风口 区块链和人工智能&#xff0c;是当前最受瞩目的两大前沿技术。一个以去中心化、可溯源的机制重构信任体系&#xff0c;另一个以智能学习与决策能力重塑数据的价值。当这两项技术相遇&#xff0c;会碰撞出什么样的火花&#xff1f; 智能合约作…...

如何提升丢包网络环境下的传输性能:从 TCP 到 QUIC,再到 wovenet 的实践

在现代互联网环境中&#xff0c;稳定、可靠的网络连接对各种在线应用至关重要。然而&#xff0c;理想情况往往难以实现&#xff0c;特别是在以下一些典型场景中&#xff0c;网络丢包&#xff08;packet loss&#xff09; 常常发生&#xff1a; 一、常见的网络丢包场景 跨境通…...

Python 中的数据结构介绍

Python 是一种功能强大的编程语言&#xff0c;它内置了多种数据结构&#xff0c;以便用户能够方便、高效地存储、处理和访问数据。数据结构是组织和存储数据的方式&#xff0c;不同的数据结构适用于不同的应用场景。掌握 Python 中的基本数据结构&#xff0c;可以使代码更加简洁…...

数据中台架构设计

数据中台分层架构 数据采集层 数据源类型&#xff1a;业务系统&#xff08;ERP、CRM&#xff09;、日志、IoT 设备、第三方 API 等。采集方式&#xff1a; 实时采集&#xff1a;Kafka、Flink CDC&#xff08;变更数据捕获&#xff09;。离线采集&#xff1a;Sqoop、DataX&…...

基于SpringBoot网上书店的设计与实现

pom.xml配置文件 1. 项目基本信息(没什么作用) <groupId>com.spring</groupId> <!--项目组织标识&#xff0c;通常对应包结构--> <artifactId>boot</artifactId> <!--项目唯一标识--> <version>0.0.1-SNAPSHOT</ve…...

Vue3路由模式为history,使用nginx部署上线后刷新404的问题

一、问题 在使用nginx部署vue3的项目后&#xff0c;发现正常时可以访问的&#xff0c;但是一旦刷新&#xff0c;就是出现404的情况 二、解决方法 1.vite.config.js配置 在vite.config.js中加入以下配置 export default defineConfig(({ mode }) > {const isProduction …...

从单机到生产:Kubernetes 部署方案全解析

&#x1f680; 从单机到生产&#xff1a;Kubernetes 部署方案全解析 &#x1f310; Kubernetes&#xff08;k8s&#xff09;是当今最流行的容器编排系统&#xff0c;广泛应用于开发、测试和生产环境。但不同的使用场景对集群规模、高可用性和资源需求有不同的要求。本文将带你…...

redis大全

1 redis安装和简介 基于ubuntu系统的安装 sudo apt update sudo apt install redis##包安装的redis 没有默认配置文件 启动 redis-server /path/to/your/redis.confredis-cliRedis 默认是没有设置用户和密码的&#xff0c;即可以无密码访问 设置密码的方法&#xff1a;可以通…...

C#经典算法面试题

C#经典算法面试题 递归算法 C#递归算法计算阶乘的方法 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿卡曼引进这个表示法。 原理:亦即n!=123…(n-1)n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!n。…...

cephadm部署ceph集群

一、什么是Ceph? ceph是一个统一的、分布式的存储系统&#xff0c;设计初衷式提供较好的性能(io)、可靠性(没有单点故障)和可扩展性(未来可以理论上无限扩展集群规模)&#xff0c;这三点也是集群架构所追求的。 “统一的”:意味着Ceph可以一套存储系统同时提供对象存储、块存…...

c#OdbcDataReader的数据读取

先有如下c#示例代码&#xff1a; string strconnect "DSNcustom;UIDsa;PWD123456;" OdbcConnection odbc new OdbcConnection(strconnect); odbc.Open(); if (odbc.State ! System.Data.ConnectionState.Open) { return; } string strSql "select ID from my…...

代码随想录训练营第十八天| 150.逆波兰表达式求值 239.滑动窗口最大值 347.前k个高频元素

150.逆波兰表达式求值&#xff1a; 文档讲解&#xff1a;代码随想录|150.逆波兰表达式求值 视频讲解&#xff1a;栈的最后表演&#xff01; | LeetCode&#xff1a;150. 逆波兰表达式求值_哔哩哔哩_bilibili 状态&#xff1a;已做出 思路&#xff1a; 这道题目是让我们按照逆波…...

数据中台产品功能介绍

在数字化转型浪潮中&#xff0c;数据中台作为企业数据管理与价值挖掘的核心枢纽&#xff0c;整合分散数据资源&#xff0c;构建统一的数据管理与服务体系。本数据中台产品涵盖数据可视化、数据建设、数据治理、数据采集开发和系统管理五大平台&#xff0c;以丰富且强大的功能模…...

第四章-初始化Direct3D

首先我们需要一个错误检测和抛出机制 inline std::string ToString(const HRESULT& result) {char buffer[256];sprintf_s(buffer, "error code : 0x%08X\n", result);return std::string(buffer); }class MyException : public std::runtime_error { public:My…...

实操3:6位数码管

文章目录 文章介绍仿真图原来的仿真代码教学用开发板段选和位选对应引脚思考题实物图 文章介绍 对应“案例5_3: 6位数码管显示0或者1【静态显示】” 跳转链接 要求&#xff1a;实现开发板的6位数码管同时显示0或者1 仿真图 原来的仿真代码 #include<reg52.h> // 头文件…...

常识补充(NVIDIA NVLink技术:打破GPU通信瓶颈的革命性互联技术)

文章目录 **引言&#xff1a;为什么需要NVLink&#xff1f;**1. NVLink技术概述1.1 什么是NVLink&#xff1f;1.2 NVLink的发展历程 2. NVLink vs. PCIe&#xff1a;关键对比2.1 带宽对比2.2 延迟对比 3. NVLink的架构与工作方式3.1 点对点直连&#xff08;P2P&#xff09;3.2 …...

openwrt 使用quilt 打补丁(patch)

1,引入 本文简单解释如何在OpenWRT下通过quilt命令打补丁--patch&#xff0c;也可查看openwrt官网提供的文档 2&#xff0c;以下代码通过编译net-snmp介绍 ① 执行编译命令之后&#xff0c;进入build_dir的net-snmp-5.9.1目录下&#xff0c;改目录即为snmp最终编译的目录了 /…...

NVIDIA Halos:智能汽车革命中的全栈式安全系统

高级辅助驾驶行业正面临一个尴尬的"安全悖论"——传感器数量翻倍的同时&#xff0c;事故率曲线却迟迟不见明显下降。究其原因&#xff0c;当前行业普遍存在三大技术困局&#xff1a; 碎片化安全方案 传统方案就像"打补丁"&#xff0c;激光雷达厂商只管点云…...

k8s术语之service

Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载均衡机制&#xff0c;提供了Service资源&#xff0c;并通过kube-proxy配合cloud provider 来适应不同的用于场景。随着kubernetes用户的激增&#xff0c;用户场景的不断丰富&#xff0c;又产生了一些新的负载均衡机制…...

C/C++工程中的Plugin机制设计与Python实现

C/C工程中的Plugin机制设计与Python实现 1. Plugin机制设计概述 在C/C工程中实现Plugin机制通常需要以下几个关键组件&#xff1a; Plugin接口定义&#xff1a;定义统一的接口规范动态加载机制&#xff1a;运行时加载动态库注册机制&#xff1a;Plugin向主程序注册自己通信机…...

RNN 与 CNN:深度学习中的两大经典模型技术解析

在人工智能和深度学习领域,RNN(Recurrent Neural Network,循环神经网络) 和 CNN(Convolutional Neural Network,卷积神经网络) 是两种非常重要的神经网络结构。 它们分别擅长处理不同类型的数据,在自然语言处理、计算机视觉等多个领域中发挥着关键作用。 本文将从原理…...

多模态训练与微调

1.为什么多模态模型需要大规模预训练&#xff1f; 多模态模型需要大规模预训练的原因包括&#xff1a; (1)数据丰富性&#xff1a;大规模预训练可以暴露模型于丰富的数据&#xff0c;提升其泛化能力。 (2)特征提取&#xff1a;通过预训练&#xff0c;模型能够学习到有效的特…...

【HDLBits刷题】Verilog Language——1.Basics

目录 一、题目与题解 1.Simple wire&#xff08;简单导线&#xff09; 2.Four wires&#xff08;4线&#xff09; 3.Inverter&#xff08;逆变器&#xff08;非门&#xff09;&#xff09; 4.AND gate &#xff08;与门&#xff09; 5. NOR gate &#xff08;或非门&am…...

基于深度学习的图像识别技术:从原理到应用

前言 在当今数字化时代&#xff0c;图像识别技术已经渗透到我们生活的方方面面&#xff0c;从智能手机的人脸解锁功能到自动驾驶汽车对交通标志的识别&#xff0c;再到医疗影像诊断中的病变检测&#xff0c;图像识别技术正以其强大的功能和广泛的应用前景&#xff0c;改变着我们…...

【coze】手册小助手(提示词、知识库、交互、发布)

【coze】手册小助手&#xff08;提示词、知识库、交互、发布&#xff09; 1、创建智能体2、添加提示词3、创建知识库4、测试智能体5、添加交互功能6、发布智能体 1、创建智能体 2、添加提示词 # 角色 你是帮助用户搜索手册资料的AI助手 ## 工作流程 ### 步骤一:查询知识库 1.每…...

【教学类-34-11】20250506异形拼图块(圆形、三角、正方,椭圆/半圆)的中2班幼儿偏好性测试(HTML)

背景介绍 最近在写一份工具运用报告,关于剪纸难度的。所以设计了蝴蝶描边系列和异形凹凸角拼图。 【教学类-102-20】蝴蝶三色图作品2——卡纸蝴蝶“满格变形图”(滴颜料按压对称花纹、原图切边后变形放大到A4横版最大化)-CSDN博客文章浏览阅读609次,点赞8次,收藏3次。【…...

Debian系统上PostgreSQL15版本安装调试插件及DBeaver相应配置

PostgreSQL所在Debian Linux服务器安装插件程序 在PostgreSQL数据库服务器Debian系统上执行以下命令&#xff0c;安装插件pldebugger: sudo apt install postgresql-15-pldebugger #上面这一条命令运行完好像pgsql服务自动重启了&#xff0c;看日志的样子是这样的&#xff0c…...