静态函数库与动态函数库(共享库)的创建

C 语言编程 — 静态库、动态库和共享库 目录 文章目录目录C 语言的库静态链接库生成静态链接库动态链接库生成动态链接库 C 语言的库 C 语言的库有两种,静态链接库和动态链接库。在 Linux 中,静态链接库命名为 lib*.a,动态库为 lib*.so。这些库文件存在的价值就是抽象出通用的函数,避免重复造轮子。不管是使用哪一种库,程序员必须在程序中通过 include 来包含相应的头文件,并在预编译阶段替换 include 的内容,然后在链接阶段将调用到的库函数从各自所在的档案库中链接到合适的地方。 静态链接库 静态链接,即:在链接阶段,将源 阅读详情

静态函数库的创建过程:

(1)生成 *.o文件;

[root@localhost mine]# ls
add.cpp add.h main.cpp sub.cpp sub.h
[root@localhost mine]# g++ -o add.o -c add.cpp
[root@localhost mine]# ls
add.cpp add.h add.o main.cpp sub.cpp sub.h
[root@localhost mine]# g++ -o sub.o -c sub.cpp
[root@localhost mine]# ls
add.cpp add.h add.o main.cpp sub.cpp sub.h sub.o
[root@localhost mine]# g++ -o main.o -c main.cpp
[root@localhost mine]# ls
add.cpp add.h add.o main.cpp main.o sub.cpp sub.h sub.o
[root@localhost mine]#

(2)创建静态函数库

[root@localhost mine]# ar -cr libaddsub.a add.o sub.o
[root@localhost mine]# ls
add.cpp add.h add.o libaddsub.a main main.cpp main.o sub.cpp sub.h sub.o
[root@localhost mine]#

其中,ar是创建静态库的命令, -c表示create, -r表示replace,表示当插入的模块名已经在库中存在就替换同名的模块,若其中的一个模块在库中不存在,ar就显示错误信息,并且不替换其他同名模块;默认情况下,新的成员增加在库的末尾!

此刻静态函数库已经创建好了,可以安全使用了,使用方法如下所示喔~:~

[root@localhost mine]# g++ -o main main.cpp -L. -laddsub
[root@localhost mine]# ls
add.cpp  add.h  add.o  libaddsub.a  main  main.cpp  sub.cpp  sub.h  sub.o
[root@localhost mine]# 

此处的-L指定静态函数库的位置供查找, “ .”表示在当前目录下查找;
-l 指定静态函数库名, 静态函数库名一般为libXXX.a,其中的lib和 .a 被忽略掉;

当静态函数库的内容被整合进编译后的文件后,即是删除掉静态函数库,那个可执行的二进制文件依然可以运行;如下所示:

[root@localhost mine]# ls
add.cpp  add.h  add.o  libaddsub.a  main  main.cpp  sub.cpp  sub.h  sub.o
[root@localhost mine]# ./main 
a = 66
b = 166
[root@localhost mine]# rm -f libaddsub.a 
[root@localhost mine]# ./main 
a = 66
b = 166
[root@localhost mine]# ls
add.cpp  add.h  add.o  main  main.cpp  sub.cpp  sub.h  sub.o
[root@localhost mine]# ./main 
a = 66
b = 166
[root@localhost mine]# 

动态函数库的创建:

(1)动态链接方法

(1)g++ -shared -o libaddsub.so add.cpp sub.cpp
生成动态库文件libaddsub.so

(2)要先将生成的.so文件加入到 /lib64中,因为动态函数库被使用时,会先在/lib64下查找动态函数库;

(3)将libaddsub.so加入到/lib64后才能生成可执行二进制文件
g++ -o main main.cpp -laddsub
-laddsub是连接动态库

[root@localhost mine]# g++ -shared -o libaddsub.so add.cpp sub.cpp 
[root@localhost mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[root@localhost mine]# g++ main -o main.cpp -laddsub
g++: error: main: No such file or directory
[root@localhost mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[root@localhost mine]# g++ -o main main.cpp -laddsub
/usr/bin/ld: cannot find -laddsub
collect2: error: ld returned 1 exit status
[root@localhost mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[root@localhost mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[root@localhost mine]# mv libaddsub.so /lib64/
Display all 2437 possibilities? (y or n)
[root@localhost mine]# mv libaddsub.so /lib64/
[root@localhost mine]# ls
add.cpp  add.h  main.cpp  sub.cpp  sub.h
[root@localhost mine]# g++ -o main main.cpp -laddsub、
/usr/bin/ld: cannot find -laddsub、
collect2: error: ld returned 1 exit status
[root@localhost mine]# g++ -o main main.cpp -laddsub
[root@localhost mine]# ls
add.cpp  add.h  main  main.cpp  sub.cpp  sub.h
[root@localhost mine]# ./main 
a = 66
b = 166
[root@localhost mine]# \cp main /root/Desktop/
[root@localhost mine]# 

(2)动态加载方法

以下是所有的源代码:

//add.h
#pragma once

int add(int x, int y);



//add.cpp
#include "add.h"

int add(int x, int y)
{
    return (x + y);
}


//sub.h
#pragma once

int sub(int a, int b);



//sub.cpp
#include "sub.h"

int sub(int a, int b)
{
    return (a - b);
}


//main.cpp
#include <iostream>

#include "add.h"
#include "sub.h"

using namespace std;

int main()
{
    int a, b;

    a = add(23, 43);
    b = sub(200, 34);

    cout <<"a = " << a << endl;
    cout <<"b = " << b << endl;

    return 0;
}
网易数智CoreAgent实战:5步教你打造企业级AI数字员工(附避坑指南) 本文以网易数智CoreAgent智能体协作中枢为核心,提供了一份企业级AI数字员工的实战部署指南。文章详细拆解了从环境准备、智能体配置、业务集成、安全合规到效果评估的五个关键步骤,并分享了部署过程中的常见“避坑”经验,旨在帮助企业技术团队高效、安全地将AI智能体落地于实际业务场景,解决AI落地难题。 阅读详情

相关推荐

使用3sigma原则去除数据表中的极端值

本文使用3sigma解决数据表中出现的极端值问题,其中包括基本原理、使用原则(检验方法)、代码展示这3个部分

qq_51397866的博客 4377

Linux----静态函数库和动态函数库制作

本文讲解了在LIinux系统下,静态函数库和动态函数库的制作,并且讲解了他们如何整合进可执行程序中的,并且讲解了他们的区别

weixin_52042488的博客 896

Power BI实战:从数据清洗到可视化报表的完整流程

本文详细介绍了使用Power BI进行数据分析的完整流程,从数据获取、清洗整理到建模与可视化。通过实战案例,重点讲解了连接MySQL数据库、使用Power Query进行数据清洗、利用DAX创建核心度量值以及设计交互式报表的关键步骤与技巧,帮助用户高效完成从原始数据到专业可视化报表的转化,实现数据驱动决策。

weixin_29070721的博客 397

静态库和动态库(转)

一、静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大--空间,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。 2. 动态函数库 这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该

微电子学与固体电子学-俞驰 4771

ArcGIS拓扑面错误批量修改

在工作学习中经常会遇到拓扑修改的问题,当数据量巨大的时候会产生拓扑问题 当拓扑错误数量巨大时,人工逐一修改是不现实的,基于此利用gis自带工具箱实现拓扑面类错误的批量修改。 一、.常见拓扑错误的类型: 1面重叠 2空隙(绿色部分) 二、拓扑检查 1新建数据库-----新建数据集—导入数据. 2新建拓扑 3修改拓扑容差及名称 添加拓扑修改规则 完成拓扑检查-查看拓扑错误 三、拓扑批量...

qq_43173805的博客 3万+

从末流211到东南软院:一个普通CS学生的保研逆袭全记录(含GPA、竞赛、面试避坑点)

本文详细记录了一位来自末流211院校的CS学生如何通过合理规划和持续努力,成功保研东南大学软件学院的完整历程。文章分享了GPA提升、竞赛策略、夏令营申请和预推免准备等关键环节的实战经验,特别强调了竞赛在弥补科研短板中的重要作用,为普通背景学生提供了可复制的保研逆袭方案。

weixin_33417488的博客 391

Linux库之动态库、静态库

Linux库之动态库、静态库 有关库的详情介绍: https://www.cnblogs.com/sunsky303/p/7731911.html https://blog.youkuaiyun.com/wk_bjut_edu_cn/article/details/81735956 1.库的介绍: 2.静态库 静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ; 优点: 运行快 发布程序无需提供静态库,因为已经在app中,移植方便 缺点:大 3.动态库 动态函数库,是在程序执行时动态(临时)由目标程序去调用

weixin_47932709的博客 298

R语言实战:三因素方差分析(ANOVA)从入门到精通(附完整代码解析)

本文详细介绍了如何使用R语言进行三因素方差分析(ANOVA),从数据准备、模型构建到结果解读与可视化,提供完整代码解析。通过实战案例,帮助读者掌握复杂交互效应的分析方法,适用于科研、教育等多个领域的数据分析需求。

weixin_29081101的博客 244

静态库和动态库(共享库)

库:从本质上来说是一种可执行代码的二进制文件,可以被载入内存中执行。                             库分为:静态库和动态库(共享库)      我们先看一下.C和.Cpp文件如何变成可执行文件的:       1.静态库和动态库的区别:                  静态库          动态库 在windows下命名           .lib       

Lyt15829797751的博客 529

深入解析Sigma Delta调制器 —— 从电流采样到数字信号处理的完整链路

本文深入解析了Sigma Delta调制器的工作原理与应用。通过剖析过采样、噪声整形与负反馈核心机制,并结合AMC1306等实例,详细阐述了从电流采样到数字信号处理的完整链路。该技术凭借其高精度和高抗干扰能力,在ADC、电流测量及音频处理等领域发挥着关键作用。

ttt77的博客 643

Android功耗系列专题分析之四:待机概率性功耗高的失效分析

本文分析了Android设备待机功耗异常高的问题。通过日志发现系统休眠失败,原因是PowerManagerService.Display唤醒锁未被释放。进一步排查发现,指纹解锁功能在灭屏时未正确释放屏幕锁定,导致DisplayReady状态异常。解决方案是将指纹功能的背光控制与DisplayReady状态控制分离,使用两个变量独立管理。经验表明,快速定位问题比解决问题更重要,修改原生流程时需谨慎评估风险。

451

10.函数库-静态库和共享库

10.函数库-静态库和共享库 函数库是指由若干目标文件按某种格式构成的集合,它分为两种类型:静态库和共享库。应用程序在链接静态库时是将所需的静态库函数嵌入至可执行文件中(并非全部静态库),而在链接共享库时它仅在可执行文件中保存加载目标对象所需的信息,真正调用时才将目标对象加载至内存。 1.        静态库由ar工具创建和更新,库文件命名规则为libxxx.a,以lib开头,.a作为文件名

badman250的专栏 3万+

C# Socket通信从入门到精通(14)——多个异步UDP客户端C#代码实现(史上最全)

本文详细介绍了Socket通信中多个异步Udp客户端功能的实现、介绍如何使用多个客户端与多个服务器进行数据的交互,包含连接服务器、断开服务器、发送数据、读取数据、C#代码实现,由高级工程师多年经验总结而成,绝对干货!

qq_34059233的博客 1982

C语言之函数库的制作与使用

C语言之函数库的制作与使用 函数库制作与使用是学习编程最基本的技能,今天我们就学习一下静态函数库和动态函数库的制作。 Linux 操作系统支持的库函数分为:静态库和动态库,他们的区别如下: 静态函数库是程序编译时加载到程序中,使用库的程序可独立运行,不受任何影响。 动态函数库在程序编译时不会加载到程序中,需要在程序运行的时候链接到库,因此使用库的程序不可独立运行。 具体区别如下表: 静...

Dallan的博客 2781

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Linux下静态库和动态库(共享库)的制作与使用

Linux下静态库和动态库(共享库)的制作与使用 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。linux系统有几个重 要的目录存放相应的函数库,如/lib /usr/lib。 静态函数库:   这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库 的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需

瑞风轻拂 990

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux动态链接库的创建与使用

Linux动态链接库的创建与使用 1. 介绍     使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。       程序函数库可分为3种类型:静态函数库(static libraries)、共享函数

marken 1159

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux动态链接库 so文件的创建与使用

Linux动态链接库 so文件的创建与使用

qq_43679818的博客 5541

dll和so文件区别与构成

转自:http://blog.sina.com.cn/s/blog_4b9b714a0100ieam.html 动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过程的一部分。在这些系统上,可执行文件包含一个叫做import directory的表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序在硬盘上搜索需要

Skypine_Lee的专栏 1285

linux下mysql问题总结

首先安装mysqlserver mysqlclient

boyhailong的专栏 1030

Linux下静态库、共享库的创建与应用

目录 1 什么是静态库和共享库 1.1 为什么要有静态库和共享库 1.2 静态库和共享库的区别 2 用例子说明两种库的创建与应用 2.1 静态库的创建与应用 2.1.1 静态库的创建 2.1.2 静态库的应用 2.1.3 静态库搜索路径 补充说明 2.2 共享库的创建与应用 2.2.1 共享库的创建 2.2.2 共享库的应用 2.2.2 共享库搜索路径 补充说明 1...

HerofH_的博客 7237

静态库和共享库

本文介绍了库的概念、函数库和库函数,以及静态库与共享库(动态库)的创建与使用。静态库在程序链接时将所用函数代码复制到可执行文件中,使得文件较大但运行时无需额外文件。共享库则在运行时加载所需函数,导致可执行文件更小,但依赖动态库的存在。创建静态库使用`ar`工具,而创建共享库则用`gcc -shared`。使用这些库时,需在编译命令中指定库的路径和名称。静态库删除后不影响已生成的可执行文件运行,但删除共享库会导致依赖它的可执行文件无法运行。

m0_52867657的博客 1218

C语言的静态库与共享库

1、库的概念 函数库是由系统建立的且有一定功能的函数集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息,但是库中对应的函数的源代码一般是不可见的,而对应的头文件中可以看到它的对外接口(函数原型)。 Linux中标准的C函数库放置在/usr/lib下,以文件形式存放。用户也可以根据自己的所需建立自己的用户函数库。函数库分为静态库(.a)和共享库(.so,ShareObj),共...

私房菜 1068

静态库、共享库和动态库

1. 介绍         使用GNU的工具我们如何在Linux下创建自己的程序函数库? 一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。        程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared 

feichideche的专栏 1046

Linux环境下静态库和动态库(共享库)的创建及使用

Linux环境下静态库和动态库(共享库)的创建及使用 编写程序时,常常将重复代码写进函数,通过多次调用函数来减少工作量,类似的,当一个工作需要多次调用某些函数和变量时,可以将这些函数、变量封装成库,供其他程序调用,提高开发效率。C语言中有两种库类型,分别为静态库和动态库(共享库)。 静态库 静态库是在目标文件链接成可执行文件过程中,直接将代码载入可执行文件,后期程序的运行不再需要静态库。在Linux系统中,静态库的后缀为.a,静态库的生成分为两步,第一步将源文件编译生成目标文件,第二步通过目标文件生成静态库

Goallegoal的博客 1283

Linux下的静态库和共享库

我们在C程序中使用过printf方法,printf方法的实现在C的标准库中。<stdio.h>是方法的声明,不是方法的实现,实现是在C的库里面。Linux系统存储的库的位置一般在:/lib 和 /usr/lib。在 64 位的系统上有些库也可能被存储在/usr/lib64 下。

ljy的博客 765

linux系统中函数库,Linux函数库(静态函数库和动态函数库)及安装过程

Linux 系统中存在大量的函数库。简单来讲,函数库就是一些函数的集合,每个函数都具有独立的功能且能被外界调用。我们在编写代码时,有些功能根本不需要自己实现,直接调用函数库中的函数即可。需要注意的是,函数库中的函数并不是以源代码的形式存在的,而是经过编译后生成的二进制文件,这些文件无法独立运行,只有链接到我们编写的程序中才可以运行。Linux 系统中的函数库分为 2 种,分别是静态函数库(简称静态...

weixin_42117032的博客 1161
上一篇: UNIX网络编程:IPC之信号量
下一篇: 线程的状态----joinable和detached
lm_123_456
博客等级 码龄11年 35粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值