C语言 共享库(动态库)制作

静态库和动态库的制作 静态库和动态库制作的简单分享 阅读详情

文章目录

 

共享库简介

共享库的本质就是将多个目标文件打包成一个文件。链接共享库就是在可执行文件中调用共享库中函数的指令处插入一些指令,在运行时通过执行这些指令来完成加载共享库以及计算出所调函数入口地址的动作。使用共享库的可执行文件占用磁盘和内存相对于静态库要小。共享库中的代码一旦被修改,只要函数接口不变,无需重新链接。使用共享库的可执行文件在运行时,需要依赖共享库。一旦共享库被删除,则可执行文件无法运行。

共享库的文件形式为:lib<库名>.so

共享库制作

代码实现

假如我们制定一个数学操作的共享库,在同一个文件夹下,有如下文件:
– add.c
– add.h
– sub.c
– sub.h

add.c为加法操作实现,sub.c为减法操作实现。
代码如下:

add.h

#ifndef C_ADD_H
#define C_ADD_H

int add(int a, int b);

#endif //C_ADD_H
  •  

add.c

#include "add.h"

int add(int a, int b) {
    return a + b;
}
  •  

sub.h

#ifndef C_SUB_H
#define C_SUB_H

int sub(int a, int b);

#endif //C_SUB_H
  •  

sub.c

#include "sub.h"

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

创建共享库

首先我们将源代码编译为目标文件:
gcc命令需要加-fPIC选项,将目标文件编译为位置无关码,动态库内部跳转都是通过全局映射表来将程序中的虚拟地址找到动态库的实际地址,来进行调用的。
gcc -fPIC -c add.c sub.c
执行完毕后会生产add.o和sub.o文件。

然后使用gcc的-shared选项来表明创建一个共享库:
gcc -shared -o libmymath.so sub.o add.o
执行完后,会创建一个libmymath.so文件。

链接使用共享库

我们为了使用上面的共享库,我们在如上相同文件夹下,创建一个main.c文件:
– add.c # 加法实现
– add.h # 加法头文件
– sub.c # 减法实现
– sub.h # 减法头文件
– libmymath.so # 共享库文件
– main.c # 入口主程序

main.c

#include <stdio.h>
#include "add.h"
#include "sub.h"

int main(void) {
    int a = 20;
    int b = 10;
    printf("%d+%d=%d\n", a, b, add(a, b));
    printf("%d-%d=%d\n", a, b, sub(a, b));
    return 0;
}
  •  

我们使用#include预处理指令包含了sub.h和add.h头文件,来使用我们制作的mymath共享库。
如果我们直接gcc -o main main.c肯定会出错,因为编译器不知道add.h和sub.h是哪里来的,也不知道add和sub函数的定义在哪里。
所以我们需要使用-l选项,让编译器链接到我们制作的共享库:
gcc -o main -lmymath main.c
执行上面的命令发现还是会报错,是因为编译器默认查找的/usr/lib;/usr/local/lib系统文件夹中的库。而非我们的制作的共享库存放地址,除非将你制作的libmymath.a放到上面的lib文件夹中,那么执行上面的命令就不会有问题。如果不在上述文件夹中,则需要使用-L来指定附加库文件搜索路径。
此处我的libmymath.a在当前目录,所以执行:
gcc -o main -lmymath -L./ main.c

sudo cp libmymath.so /lib

把libmymath.so 拷贝到/lib路径下,以便可执行文件运行后加载库。

注意:gcc的-l选项后面跟的库名,只需要指定除去lib和.so后缀的中间的实际命名就可以了,编译器会自动按照lib<库名>.so规则来搜索库文件。
如果预处理指令#include包含的头文件不在当前目录下,则需要在gcc的时候,通过-I选项来指定头文件附加搜索路径。

此时在当前目录生成了main的可执行文件。
运行得到如下:

20+10=30
20-10=10
  •  

可执行文件在运行期需加载动态库文件,所以如果动态库被删除,那么执行文件会报错。

至此,从动态库的制作到链接使用就结束了。

小结

创建动态库gcc编译目标文件需使用-fpic选项来为目标文件生成位置无关码:
gcc -fPIC -c xx1.c xx2.c
将多个目标文件打包成一个libxx.so文件:
gcc -shared -o libxx.so xx1.o xx2.o
在可执行程序编译链接共享库,和链接静态库是一样的:
gcc -l<库名> -L<库附加搜索路径> xx.c

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

相关推荐

HPC软件使用之ANSYS Fluent

本文介绍了如何在超级计算机上使用ANSYS Fluent进行科学计算和工程仿真。文章首先对Fluent软件进行了简要介绍,强调了其在计算流体力学领域的广泛应用和强大功能。接着,详细说明了如何编写jou脚本文件和slurm脚本文件,以控制Fluent的计算流程和作业提交。文章还提供了作业提交和查看的具体命令,并通过一个鼓风机仿真的案例演示了从网格模型准备、脚本编写、作业提交到结果查看的完整流程。最后,展示了使用Fluent进行结果可视化的方法。

欢迎各位大佬光临“寒舍”!请多多指点,共同进步! 2208

将.c .h文件打包成静态库 .a .so

一、打包.a 1.Cocoa Touch Static Library 2.添加要打包的文件 3.将头文件添加到Build Phases -> Copy Files中去 4.需要修改Build Settings中的 Build Active Architecture Only 以满足运行不同CPU环境的模拟器。将此设置为NO。  选择Edit Scheme--> Buid ...

weixin_30246221的博客 856

Dify学习笔记-知识库(六)

Dify学习笔记-知识库

大数据知识梳理 2万+

Tips--windows系统下gcc编译C文件为so共享库

windows系统下gcc编译C文件为so共享库1. windows系统安装gcc编译工具2. 利用gcc编译多个c文件3. 利用python工具验证生成的so共享库 1. windows系统安装gcc编译工具 对于工作机是windows又不想装linux虚拟机的朋友,Mingw-w64是目前兼容性最好的应用。官网链接戳这里。 打开链接之后可以看到上图所示的画面,点击左边的“download”按钮,可以看到如下界面: 鼠标向下滑,我们找到标题为“Sources”的一段文字,点击第一行的“SourceFo

魔法师の屋子★↓☆ 1万+

ADS2023实战:2.4GHz超外差接收机从设计到链路预算全流程解析

本文以ADS 2023软件为平台,详细解析了2.4GHz超外差接收机从核心指标定义、架构原理到完整链路搭建与仿真的全流程。通过实战演练,重点阐述了如何利用ADS进行谐波平衡仿真和链路预算分析,以量化评估系统增益、噪声系数等关键性能,为射频工程师提供了一套从理论到仿真的系统级设计方法。

herb5的博客 816

BES (恒玄)HFP通话笔记

1.audio_developer 调试:SDK 需要打开某个算法,需要原厂打开对应宏定义编译出新的SDK,只要涉及到lib库里的功能都需要原厂手动修改编译。开发商和原厂FAE做起来都会比较累。如果没有原厂支持根本没法做,很少文档,SDK也很多问题,没法开箱即用如果要支持audio_developer上位机调试,还需改代码,如果对整个原理不清楚就没法做,没文档只能啃代码调试工具设计的也有待加强,串口通讯调试对耳机这类产品非常麻烦,本来板子就不大,还要焊接一堆线,调试还要拖着串口线。

飞天鱼 685

mysql.h 动态编译命令_Linux下gcc编译生成动态连接库*.so文件并调用它

Linux下gcc编译生成动态连接库*.so文件并调用它node动态库*.so在linux下用c和c++编程时常常会碰到,最近在网站找了几篇文章介绍动态库的编译和连接,总算搞懂了这个以前一直不太了解得东东,这里作个笔记,也为其它正为动态库连接库而苦恼的兄弟们提供一点帮助。1、动态库的编译下面经过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、...

weixin_32819265的博客 1314

舵机PWM信号转互斥继电器开关信号

-----------------本文由“麦粒电子”撰写,并提供相应产品服务。---------------- 叙述 上次的PWM转继电器开关方案得到大家的不少好评(博客链接),但是发现有些玩家需要一路PWM同时去控制两路继电器开关通断,并且两者是互斥的,好去控制两种不同的负载。所以就继续升级了如下的模块。 正常的控制部件顺序这样:遥控器按钮拨动,遥控器接收机相应通道PWM值变化,PWM转开关模块检测PWM值发生变化从而驱动相应机械继电器触点吸合释放。本模块的两个继电器动作是互斥的,也就是不会同时吸合。

Mai_LiElectronic的博客 1627

android jni开发,用javah生成***.h头文件,用ndk在libs下生成***.so文件

1、将引用本地方法的类生成****.h头文件:          打开控制台,进入工程目录(F:\新建文件夹\JNITest)          cd F:\新建文件夹\JNITest          输入如下命令编译h头文件          javah -classpath bin /classes -d jni com.example.jnitest.J

上善若水 1850

【Cadence】Virtuoso@LayoutXL 差分电路版图镜像同步技巧详解

本文详细介绍了在Cadence Virtuoso LayoutXL中实现差分电路版图镜像同步的技巧,包括核心需求、环境配置、分步操作指南及高级技巧。通过使用LayoutXL的Group功能,工程师可以高效保持差分电路的对称性,提升版图迭代效率,确保高速信号处理的稳定性。特别适用于深亚微米工艺下的差分放大器设计。

weixin_29215391的博客 323

PCB布局布线要求及多层电路板叠加原则

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考本文主要针对PCB布局布线中的要点进行了总结,并对多层电路板的叠加原则进行了解释。

Ka_wyb的博客 2932

Mac系统C语言环境搭建

下载对应mac系统版本的xcode,我的电脑是macOS Monterey版本,下载的Xcode版本是Xcode14.0。接着打开xcode,选择新建项目。选择命令行工具,点击下一步。输入项目名称,选择语言。

Hymannn的博客 1212

总目录- AutoSAR从入门到精通实战系列课程【持续更新中...】

欢迎大家订阅《AutoSAR入门和实战系列》,开始前博主先列出AutoSAR学习的大纲,同时这也可以作为大家学习AutoSAR的参考。想学习和及以及的同学们,可以订阅本博客,本博客一直持续更新中。如果想深入或从本质上学习和理解AutoSAR,打开此链接后,,点击左下方【立即订阅】订阅专栏!!!】......

4万+

Linux C语言动态库及静态库

假设在math目录下已编辑好add.c sub.c div.c mul.c func_point.c文件,func_point.c为包含main()的源文件!    动态库的制作:    方法一: gcc -c -fPIC add.c sub.c div.c mul.c //-c表示生成.o目标文件,-f后加一些编译选项,PIC表示与位置无关 gcc -shared -o libmymat

Yancygao的专栏 1124

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

Dallan的博客 2781

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

20252803-滕森-C编程工具测试-静态库和动态库的制作与使用

Makefile编写1、大小端判断是通过检查多字节数据的存储顺序来实现的2、静态库(.a) 在编译时被完整复制到可执行文件中3、共享库(.so) 在运行时动态加载,节省内存空间4、Makefile 自动化编译过程,提高开发效率这些技能在实际的嵌入式开发和系统编程中非常重要,特别是在国产化平台的开发中。继续加油,20252803 滕森!作业提交要求拷贝出AI生成的所有内容,把你实践编译和测试过程截图插入,AI生成内容不满意,可以刷新一下,代码可能不能直接使用,需要你做简单修改。

zhan_qian的博客 342

计算机控制技术及应用

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

树莓派的核心开发的流程

树莓派的开发

2501_90923997的博客 677

第二节、文件编译、调试及库制作

本文摘要: Linux权限系统:详细解释了rwx权限对文件和目录的不同作用,r权限允许查看内容/列表,w权限允许修改内容/结构,x权限控制执行/进入目录的能力。 GCC编译过程:完整解析四个编译阶段(预处理、编译、汇编、链接),包括各阶段命令和原理说明,重点介绍了数据段合并和地址回填机制。 函数库开发:对比静态库(.a)和动态库(.so)的机制差异,提供从源码到库文件的完整制作流程,包括编译选项、链接方法及环境配置技巧。 Makefile工程管理:讲解核心语法规则、自动变量和模式匹配,演示如何通过wildc

linmu18HJL的博客 1077

系统IO——库文件

静态库实际就是一些目标文件(一般以.o结尾)的集合,

2301_77766416的博客 1255

静态库与动态库的使用

库是写好的,现有的,成熟的,可以复用的代码。本质上来说,库是一种可执行代码的。

2301_80655427的博客 1973

io进程----库

io进程----如何创建动态库和静态库

新手嵌入式学习的博客 1035

Linux基础——gcc编译器、静态库、动态库

本文内容是在学习传智播客Linux课程时,由其课堂笔记和资料整理而来。具体内容包括:gcc编译器的使用、静态库的制作与使用、动态库的制作与使用。

jiang少的博客 489

为类型定义取别名、环境变量、静态库与动态库(day03)

一、为类型命名别名 struct node{ int num; struct node *next; }; typedef struct node node_t; node_t n; 使用typedef为类型定义别名。 三个步骤: 1、定义一个类型的变量或常量 2、在第一步的基础上,在最前边加上typedef关键字,这时候,原来的变量或常量就是...

aikcsu4084的博客 434

静态库和共享库(动态库) 动态调用共享库 C的错误处理

程序员找工作的流程: 写简历(差异化)->被通知笔试(背笔试题)->面试(两轮-人力、技术)->等待 由于项目比较复杂,代码数量非常庞大,可以把代码打包成库文件,提供库文件和头文件即可。 库文件分为两种: 静态库 和共享库(动态库),静态库和共享库都是代码的归档文件。使用静态库时,把静态库的代码复制到目标文件中,导致目标文件比较大;使用共享库时,把函数的地址放到目标文件中。

Robot Man的技术博客 2222

win7编译c语言动态库,C语言创建共享库(动态库)步骤

C语言创建共享库(动态库)步骤:创建sth.c,共享库源文件://sth.c库源程序unsigned long long sth(unsigned int x, unsigned int y){return (x+y+x*y);}创建测试文件://test.c#include#includeint main(int argc, char *argv[]){unsigned int x, y;ssc...

weixin_36433524的博客 696
上一篇: C语言 静态库制作(亲测可行)
下一篇: 深入理解FIFO(包含有FIFO深度的解释)
csshuke
博客等级 码龄16年 1517粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值