C语言静态库与动态库

库 是一种代码的二进制的封装形式,将.o文件打包封装就成了库。库可以在任何地方使用,但用户却不能看见他的具体实现。库有利于代码模块化,只要接口设计得合理,改变库的内部实现,不会影响到用户级别的代码使用。

动态库

1.封装动态库
假设有源代码sum.c, sub.c

gcc sum.c -c -o sum.o
gcc sub.c -c -o sub.o
//封装成库
gcc -shared -fPIC -o libmymath.so sum.o sub.o
/*
-shared 表示要编译一个共享库
-fPIC 表示要生成与位置无关的代码
-o 要创建的库的名称,一般约定库的名称格式如下:
        lib库名.so
*/

2.动态库的编译
只需把.h与.so文件提供给用户使用即可
用户编译形式如下:

gcc main.c  -I 头文件路径 -L 库文件路径 -l库名
ex:
    gcc test.c -I ../mymath/ -L ../mymath/ -lmymath
//路径可以是相对路径也可以是绝对路径

3.依赖动态库的程序执行
用户执行时需要指明库所在的路径,通常通过添加环境变量的方式实现
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库文件路径
查看库环境变量
echo $LD_LIBRARY_PATH

使用命令lld可查看

静态库

1.封装静态库
假设有源代码sum.c, sub.c

gcc sum.c -c -o sum.o
gcc sub.c -c -o sub.o
//静态库的后缀名是.a
ar -rc libmymath.a  sum.o sub.o
//-rc 中的r 表示插入目标文件到静态库中,c表示创建指定的静态库

2.静态库编译

gcc main.c  -I 头文件路径 -L 库文件路径 -l库名
ex:
    gcc test.c -I ../mymath/ -L ../mymath/ -lmymath
//如果该路径下有动态库,则会优先使用动态库

//如果要静态链接自己或第三方的库,但又要动态链接系统的库,那么编译方式如下
gcc xxx.c -I 头文件路径 静态库的完整的名称
ex:
    gcc xxx.c -I ../mymath/ ../mymath/libmymath.a

//全部使用静态库,在编译时加 -static
gcc main.c  -I 头文件路径 -L 库文件路径 -l库名 -static

动态库与静态库的主要区别

静态库和动态库都是二进制文件(目标文件)的封装

对于动态库,编译程序时,并没有把动态库的内容复制到可执行文件中去,仅仅是做了一个标记,表示可执行文件需要用到某个动态库,当执行程序时,首先需要去LD_LIBRARY_PATH指定的路径下(或库的标准路径,如/lib,如/usr/lib等)查找需要的动态库,才能正常运行。

对于静态库,编译程序时,会把静态库中的内容复制到可执行文件中去,运行程序时,就不再需要那个静态库了。

我们使用得最多的是动态库,理由:
1、程序运行时,动态库在内存中只需要一份,而静态库,则可能会有多份拷贝,造成所谓的代码
冗余。
2、当库更新升级时,对于动态库来说只要接口不变,则不需要重新编译用户程序,如果是静态库,则库改变了,所有使用该库的程序都必须重新编译。

C&C++混合编程中库的处理

c++兼容c,能够直接使用这些功能,用c开发的功能如果打包成库了(经c编译器编译成目标文件),目标文件中的函数名就已经确定下来。而c++编译器会对函数名进行处理,会由于函数名字不匹配而导致调用c库中的函数失败

解决办法:
C++提供了一个关键字: extern “C”, 称为链接指示,通常写在头文件中。但c编译器并不认识这个关键字。因此用法如下:

#ifdef __cplusplus
extern "C"
{
#endif

    int sum(int a, int b); // C函数声明
    int sub(int a, int b); // 可包含多个函数声明

#ifdef __cplusplus
}
#endif

负责任的程序员,理应在c语言编写的库中加入该关键字

Original: https://www.cnblogs.com/left23333/p/16350034.html
Author: Left23333
Title: C语言静态库与动态库

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582418/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • podman

    podman Podman 是一个无守护程序、开源的 Linux 原生工具,旨在使用开放容器计划 (OCI) 容器和容器映像轻松查找、运行、构建、共享和部署应用程序。Podman …

    Linux 2023年6月7日
    060
  • Xshell中用./startup.sh启动时候提示权限不够

    授予脚本权限 chmod u+x *.sh 或者使用 chmod 777 ./service-demo.sh Original: https://www.cnblogs.com/q…

    Linux 2023年5月28日
    076
  • Linux 常用命令总结(三)

    一、实用命令 1、crontab(定时任务) (1)基本概念crontab 是用来管理定时任务的命令。系统启动后,将会自动调用 crontab,如果存在任务,则根据相关定义去执行。…

    Linux 2023年6月14日
    073
  • Question03-查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

    * SELECT stu.SID, stu.Sname, CAST(AVG(sc.score) AS DECIMAL(18,2)) avg_score FROM Student s…

    Linux 2023年6月7日
    082
  • python一键探测编码

    程序功能 按文件输出编码or按编码输出文件 源码 主要代码功能 1.实现文件遍历 2.chardet获取编码 3.传参,对符合编码条件的文件输出 4.打开文件夹选择对话框 程序功能…

    Linux 2023年6月7日
    0116
  • windows 使用挂载盘提供FTP服务

    环境说明: NFS服务器:centos7.0 IP:192.168.18.10 FTP服务器:windows server 2008 IP:192.168.18.41 准备工作: …

    Linux 2023年6月8日
    0159
  • 如何优化前端性能?

    导读:随着前端的范畴逐渐扩大,深度逐渐下沉,富前端必然带来的一个问题就是性能。特别是在大型复杂项目中,重前端业务可能因为一个小小的数据依赖,导致整个页面卡顿甚至崩溃。本文基于Qui…

    Linux 2023年6月8日
    0109
  • Golang中字符串、数组、切片排序

    使用Golang的sort包用来排序,包括二分查找等操作。下面通过实例代码来分享下sort包的使用技巧: 使用接口排序: sort.Sort(data Interface) 自定义…

    Linux 2023年6月6日
    0102
  • 计算机辅助数据绘图(matlabpythonjs)

    1. matlab绘图 官方说明:https://ww2.mathworks.cn/help/matlab/creating_plots/types-of-matlab-plots…

    Linux 2023年6月14日
    0112
  • k8s vs k3s: 差异解析

    2. K3s的优势 小型 K3s 的最大优势是它的尺寸最小(小于 100 MB),这有助于它以最少的设置在小型硬件中启动 Kubernetes 集群。 快速部署 curl -sfL…

    Linux 2023年6月13日
    0103
  • 如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题

    问题描述 如今显示器的分辨率越来越高,如果不启用 DPI 缩放,软件的字体和图标在高分屏下就会显得非常小,看得很累人。从 5.6 版本开始,Qt 便能支持 DPI 缩放功能,Qt6…

    Linux 2023年6月7日
    0190
  • 用 shell 脚本做 tcp 协议模拟

    问题背景 公司有一套消息推送系统(简称GCM),由于人事变动接手了其中的客户端部分。看了一下文档,仅通讯协议部分有几页简单的说明,代码呢又多又乱,一时理不出一个头绪。由于消息是从后…

    Linux 2023年6月6日
    0135
  • 工作三年的一些感悟

    前言 很久没有上博客,我是看着其中一篇文章进来,然后正好我也加起来三年,那就提笔写一下感触,出来三年基本上和有些同学断了联系,唯有室友还偶尔还会聊上几句,三年做过游戏测试、社交AP…

    Linux 2023年6月8日
    097
  • (十)redis源码解读

    一、redis工作机制 redis是 单线程,所有命令(set,get等)都会加入到队列中,然后一个个执行。 二、为什么redis速度快? 1、基于内存 2、redis协议resp…

    Linux 2023年5月28日
    097
  • 作业一、安装Ubuntu系统

    Ubuntu1804安装 一、安装环境 1、VMware Workstation 16 Pro 2、Ubuntu 18.04.6 LTS 二、部署系统 步骤1、进入VMware,点…

    Linux 2023年6月13日
    079
  • 17-二分查找

    * import java.util.Arrays; import java.util.Random; import java.util.Scanner; public class…

    Linux 2023年6月7日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球