首页 > 编程语言 >c/c++中的静态链接与动态链接

c/c++中的静态链接与动态链接

时间:2024-12-05 20:29:36浏览次数:10  
标签:可执行文件 静态 c++ int 动态 链接 加载

一、静态链接

静态链接是编译程序时把库文件中的代码和数据复制到可执行文件中的链接方式,程序运行时不依赖外部库,方便移植,但文件较大,更新库需重新编译程序。

特点:

1. 生成一个单独的可执行文件:在链接阶段,将所有需要的目标模块(包括库函数)都整合到一个单独的可执行文件中。这意味着这个可执行文件不依赖于其他外部模块,在运行时可以独立执行。

2. 空间效率相对较低:因为会将用到的库函数整个链接进来,即使某些函数可能未被实际调用,也会占用空间。

3. 部署相对简单:只需要将这一个可执行文件部署到目标系统即可。

#include <stdio.h>

int main() {
    printf("Hello\n");
    return 0;
}
//printf  函数通常是通过静态链接的标准 C 库提供的。
//当我们编译并链接这个程序时, printf  函数的代码会被包含在最终生成的可执行文件中。

二、动态链接:

动态链接是指在程序运行时才将外部共享库加载进内存并与程序进行链接的方式,它减小了可执行文件大小,方便更新库,但运行时需依赖库文件,部署相对复杂。

特点:

1. 节省内存:多个程序可以共享同一个动态库的一份副本,而不是每个程序都包含库的完整副本。

2. 便于更新:只需更新动态库,使用该库的所有程序无需重新编译就能使用新的功能。

3. 灵活加载:可以根据需要在运行时决定是否加载某些模块。

#include <stdio.h>

// 声明一个来自动态链接库的函数
extern int dynamic_function(int);

int main() {
    int result = dynamic_function(5);
    printf("Result: %d\n", result);
    return 0;
}
 

静态链接与动态链接的区别:

1. 内存占用:
- 静态链接:每个程序都包含库的完整副本,内存占用较大。
- 动态链接:多个程序可以共享同一个动态库的一份副本,节省内存。
2. 更新方式:
- 静态链接:若库有更新,使用该库的所有程序都需要重新编译。
- 动态链接:只需更新动态库,使用该库的所有程序无需重新编译就能使用新的功能,更新更方便。
3. 加载灵活性:
- 静态链接:在编译时就完成链接,不具备运行时的灵活性。
- 动态链接:可以根据需要在运行时决定是否加载某些模块,加载更灵活。

标签:可执行文件,静态,c++,int,动态,链接,加载
From: https://blog.csdn.net/2401_88249494/article/details/144245745

相关文章

  • C++中的封装性
    定义:封装性:1.将属性(成员变量)和行为(成员函数)作为一个整体,表现在生活中的事物2.将属性和行为加以权限控制(将事物的属性(成员变量)和行为(成员函数)封装在一起形成一个类,并且设置相应的访问权限)C++中如何实现封装:将数据成员设为私有或保护类型,再提供公有成员函数访问和修改数据,......
  • C++中对象的初始化和清理
    一、.初始化:对象的初始化使用构造函数构造函数构造函数:主要作用在于创造对时为对象的成员属性(成员变量)赋值,构造函数由编译器自动调用,无需手动调用语法:类名(){}1.构造函数没有返回值,函数名前也不用写void2.函数名与类名相同3.构造函数可以有参数,因此可以发生重载4.程序在......
  • C++学习日记---第18天(5k字 重载运算符快速通关)
    (本文包含了从基础到中等的运算符重载内容,以及一些在编写代码时可能遇到的问题) 笔记复习1.运算符重载以代码实现一个类的两个对象相加为例#include<iostream>usingnamespacestd;classperson{ intm_deposit=1000; intincome=100;};intmain(){ person......
  • C++算法练习-day62——491.非递减子序列
    题目来源:.-力扣(LeetCode)题目思路分析这个问题要求找出数组 nums 中的所有非严格递增子序列,其中每个子序列至少包含两个元素。非严格递增子序列意味着子序列中的元素可以相等,但不允许递减。为了解决这个问题,可以使用回溯法。回溯法是一种通过探索所有可能的候选解来找出......
  • C++算法练习-day61——90.子集2
    题目来源:.-力扣(LeetCode)题目思路分析题目要求找出给定数组的所有子集(幂集),但数组可能包含重复元素,要求结果中的子集是唯一的(不包含重复的子集)。为了解决这个问题,我们可以先对数组进行排序,然后在回溯过程中跳过重复的元素,以确保生成的每个子集都是唯一的。代码:#include<v......
  • C++算法练习-day60——78.子集问题
    题目来源:.-力扣(LeetCode)题目思路分析题目要求找出给定数组的所有子集(幂集)。子集是指原数组中任意元素组合形成的数组,包括空集和原数组本身。这个问题可以通过回溯算法(Backtracking)来解决。回溯算法是一种通过探索所有可能的候选解来找出所有解的算法。对于子集问题,我们可以......
  • 即时编译(JIT,Just-In-Time compilation) 是一种在程序运行时将代码从中间表示(如字节码)编
    即时编译(JIT,Just-In-Timecompilation)是一种在程序运行时将代码从中间表示(如字节码)编译为机器码的技术。与传统的预先编译(静态编译)不同,JIT编译是在程序执行时动态地生成机器代码,这使得它能够根据运行时的实际情况进行优化,从而提高程序的执行效率。JIT的基本概念在JIT编译的......
  • 【网页成品】24节气之冬至主题网页——WEB学生静态网页作业设计(HTML+CSS)(1个页面)
    ......
  • 【网页成品】电影加勒比海盗介绍主题网页——WEB学生静态网页作业设计(HTML+CSS)(1个
    ......
  • HTML静态网页成品作业(HTML+CSS)——家乡沅陵介绍网页(1个页面)
    ......