GCC生成静态库.a和动态库.so

2023-10-29

目录

一、静态库和动态库

 1.1静态库

1.2动态库 

二、GCC生成静态库和动态库

2.1准备过程

 ​

 2.2静态库的使用

 2.3动态库的使用

 2.4静态库与动态库的比较

 三、库的使用实例

1.代码:

2.生成静态库 

 3.生成动态库


一、静态库和动态库

 1.1静态库

 静态库即静态链接库(Windows 下的 .lib,Linux 和 Mac 下的 .a)。之所以叫做静态,是因为静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。
静态库的好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大。

1.2动态库 

动态库即动态链接库(Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib)。与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。

二、GCC生成静态库和动态库

2.1准备过程

准备三个c语言文件,分别为hello.h、hello.c、main.c,使用vim编写三个文件,同时,创建一个文件夹test1来储存文件,代码如下。

mkdir test1
cd test1

 

三个文件代码如下:

hello.h

#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif//HELLO_H

hello.c

#include<stdio.h>
void hello(const char *name)
{
	printf("Hello %s\n",name);
}

 main.c

#include"hello.h"
int main()
{
	hello("everyone!");
	return 0;
}

然后用gcc进行编译

gcc -c hello.c
ls

 2.2静态库的使用

1.创建静态库

静态库文件名的命名规范是以lib为前缀,拓展名为.a。创建静态库用ar命令。

ar -crv libmyhello.a hello.o

同时输入ls查看文件 

从结果来看,创建成功。 

 2.程序中使用静态库

输入代码:

gcc -o hello main.c -L. -lmyhello

 注意:对于自定义的静态库,main.c还可以放在-L.和-lmyhello之间,否则myhello没有定义。
-L.:表示连接的库在当前目录

 3.验证静态库的特点
在删掉静态库的情况下,运行可执行文件,发现程序仍旧正常运行,表明静态库跟程序执行没有联系。同时,也表明静态库是在程序编译的时候被连接到代码中的。

  

 2.3动态库的使用

1.创建动态库

动态库文件命名规范以lib作为前缀,拓展名为.so

gcc -shared -fPIC -o libmyhello.so hello.o

shared:表示指定生成动态链接库,不可省略
-fPIC:表示编译为位置独立的代码,不可省略

 2.在程序中使用动态库

gcc -o hello main.c -L. -lmyhello

或者

gcc main.c libmyhello.so -o hello

然后运行hello文件时我们会发现错误

问题的解决方法:将libmyhello.so复制到目录/usr/lib中。因为运行时,是在/usr/lib中找库文件的。

sudo mv libmyhello.so /usr/lib

 

 2.4静态库与动态库的比较

gcc编译得到.o文件 gcc -c hello.c
创建静态库 ar -crv libmyhello.a hello.o
创建动态库 gcc -shared -fPIC -o libmyhello.so hello.o
使用库生成可执行文件 gcc -o hello main.c -L. -lmyhello
执行可执行文件 ./hello 

 三、库的使用实例

1.代码:

sub1.c

float x2x(int a,int b)
{
	float c=0;
	c=a+b;
	return c;
}

sub2.c

float x2y(int a,int b)
{
	float c=0;
	c=a/b;
	return c;
}

 sub.h

#ifndef SUB_H
#define SUB_H
float x2x(int a,int b);
float x2y(int a,int b);
#endif

main.c

#include<stdio.h>
#include"sub.h"
void main()
{
	int a,b;
	scanf("%d",&a);
	scanf("%d",&b);
	printf("a+b=%.2f\n",x2x(a,b));
	printf("a/b=%.2f\n",x2y(a,b));
}

 然后用gcc进行编译gcc -c sub1.c sub2.c

2.生成静态库 

ar crv libsub.a sub1.o sub2.o

 

然后连接文件gcc -o main main.c libsub.a,执行文件

 3.生成动态库

gcc -shared -fPIC libsub.so sub1.o sub2.o
gcc -o main main.c libsub.so

 4.静态库与动态库文件大小的比较

输入size命令查看静态库与动态库文件大小

 通过结果发现,动态库的文件要大一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC生成静态库.a和动态库.so 的相关文章

  • 使用MVVM Light的Messenger在视图模型之间传递值

    有人可以帮我解释一下 MVVM Light 的 Messenger 吗 我正在阅读 StackOverflow 上的一篇文章 MVVM 在视图模型之间传递值 https stackoverflow com questions 6392854
  • 与 Visual Studio 2010 的静态 libpng 链接

    我正在尝试向我的应用程序添加 PNG 支持 因此我想包含 libpng 我知道它需要 zlib 因此我也下载了它 我进入 png 文件夹 projects vstudio 然后打开解决方案 我编译了它 一切顺利 我将其中的一些标头添加到我的
  • 多次客户端打印后,Arduino (Uno) 以太网客户端连接失败

    我正在使用带有以太网扩展板的 Arduino Uno 发送多次 HTTP 请求后 客户端 println 客户端连接时开始失败 故障时间似乎是随机的 并且循环中的序列读数可能在 1000 和 7000 之间变化 该错误与以太网发送缓冲区溢出
  • 如何在 OpenCV 中将 Float Mat 写入文件

    我有一个矩阵 Mat B 480 640 CV 32FC1 包含浮点值 我想将此矩阵写入一个可以打开的文件Notepad https en wikipedia org wiki Windows Notepad or 微软Word https
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 模板:模板函数与类模板成员函数不能很好地配合[重复]

    这个问题在这里已经有答案了 这是我实际拥有的一些代码的最小测试用例 当它尝试评估时失败a getResult b test cpp In function void printStuff const A test cpp 6 error e
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 将 0x1234 转换为 0x11223344

    如何高性能地将十六进制数0x1234扩展到0x11223344 unsigned int c 0x1234 b b c 0xff lt lt 4 c 0xf c 0xff0 lt lt 8 c 0xff00 lt lt 12 c 0xf00
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • Facebook C# SDK 从 V5 迁移到 V6

    我正在尝试从 SDK 的 V5 3 2 迁移到 V6 我有一个 ASP NET 4 0 Canvas 应用程序 我注意到现在不再有 facebook web dll 我以前使用过 并找到了以下信息 gt 删除 Facebook Web dl
  • 什么更快?

    如果我们有以下 2 个 C 代码片段可以完成相同的任务 int a b somenumber while b gt 0 a b 3 b 3 or int b somenumber while b gt 0 int a b 3 b 3 我对计
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • 将 CollectionBase 转换为 List 或可用于 Linq 的数据类型

    我正在使用 Aspose 单元格来操作 Excel 电子表格 API 中的类型之一是电子表格中的图片集合 它派生自 CollectionBase 请参阅此链接 http www aspose com documentation net co
  • static_assert 有什么作用,你会用它做什么?

    你能举个例子吗static assert C 11 会优雅地解决手头的问题吗 我熟悉运行时assert 我应该选择什么时候static assert 超过常规assert 另外 在boost有一种东西叫做BOOST STATIC ASSER
  • 我可以以编程方式更改 Xamarin.Forms 中的 styles.xml 吗?

    我们有一个可自定义颜色的应用程序 这使得列表视图中所选项目的橙色 Android 默认值有时看起来很糟糕 我们想要更改列表视图所选项目的颜色 我知道如何在我们页面的后台代码 xaml cs 中执行此操作 并且我知道您可以在 styles x
  • C# 以非管理员权限运行进程

    我启动了一个有关管理员权限的流程 psi Verb runas process StartInfo psi process Start 但现在这个过程必须启动另一个应用程序 但需要非管理员权限 应用程序适用于非管理员权限 我怎样才能做到这一
  • 为什么我们从 MultiByte 转换为 WideChar?

    我习惯于处理 ASCII 字符串 但现在使用 UNICODE 我对一些术语感到非常困惑 什么是多字节字符以及什么是widechar有什么不同 多字节是指在内存中包含多个字节的字符吗 widechar只是一个数据类型来表示吗 为什么我们要从M
  • 在 Jenkins 中执行批处理文件

    我有一个简单的批处理文件 我想要从 Jenkins 调用 运行 执行该文件 Jenkins 中有同样的插件吗 如何从 Jenkins 执行批处理文件 如果有相同的教程或文档 无需为此添加新插件 在Jenkins 选择您的工作名称并转到配置部
  • Nunit 测试给出结果 OneTimeSetUp: 未找到合适的构造函数

    我有一个问题 NUnit 告诉我 没有找到合适的构造函数 这是什么原因造成的 我还收到另一条消息 异常没有堆栈跟踪 这两条消息只是一遍又一遍地重复 这是我的代码 TestFixture public class SecurityServic
  • 查找文本中所有关键字的有效算法

    我有很多字符串 其中包含许多不同拼写的文本 我通过搜索关键字来标记这些字符串 如果找到关键字 我将使用该关键字的关联文本 假设搜索字符串可以包含文本 schw schwa 和 施瓦茨 我有三个关键字 全部解析为文本 schwarz 现在我正

随机推荐

  • 开源Go语言数值算法库 An open numerical library purely based on Go programming language

    目录 关于 goNum https github com chfenger goNum 安装环境 安装方法 算法 许可证书 致谢 关于goNum goNum是一款完全以Go语言为基础的开源数值算法库 它可以使你像调用其它go函数一样使用其进
  • 使用CSS实现国际象棋棋盘

    系列文章目录 CSS3实现半透明边框 1 CSS3实现多重边框 2 CSS3如何调整背景图片大小 3 CSS3背景定位 4 CSS3设置条纹背景 5 使用CSS实现国际象棋棋盘 系列文章目录 前言 一 直角三角形 拼成正方形 二 使用步骤
  • c++:异常处理机制

    什么是异常 1 异常是一种程序控制机制 与函数机制独立和互补 函数是一种以栈结构展开的上下函数衔接的程序控制系统 而异常是另一种控制结构 它依附于栈结构 却可以同时设置多 个异常类型作为网捕条件 从而以类型匹配在栈机制中跳跃回馈 异常的设计
  • 用栈实现算数表达式求值(C语言(基础版))

    要求 输入以 为结束的算数表达式 包括 并求值 1 基础的栈结构书写 包括创建栈 判断栈是否为空 以及数据的压栈和出栈 可参考MOOC上陈越姥姥的相关数据结构课程 include
  • 红帽认证-RHCE

    目录 RHCE认证考的是 ansible的内容 重要信息配置 一 安装和配置Ansible 二 创建和运行Ansible 临时命命 三 安装软件包 四 使用RHEL系统角色 五 使用Ansible Galaxy 安装角色 六 创建使用角色
  • PostgreSQL解锁表

    PostgreSQL解锁表 一 查看单表加锁情况 二 取消一个长时间执行的sql 2 1 终止查询 但是连接留在原地 2 2 终止查询 同时杀死连接 三 查看锁表的详细信息 一 查看单表加锁情况 SELECT relation regcla
  • 转眼已走在成为程序猿的路上

    考完研 没有回家 直接找地方实习 虽不是太累可还是不能和上学相比 宿舍只剩孤身一人 转眼四年 加油吧 梦在前方
  • Pytorch raise NotImplementedError NotImplementedError

    我以为是我的网络搭建出错 结果竟是输入格式出错 如果出现这个问题 一般是forward这块出错 我是拼写出错 是forward 修改过后正常 还有可能是tap缩进的时候出错 def没有对齐 如果报错 可以先查查格式
  • 网络安全的基础知识

    1 什么是防火墙 什么是堡垒主机 什么是DMZ 防火墙是在两个网络之间强制实施访问控制策略的一个系统或一组系统 堡垒主机是一种配置了安全防范措施的网络上的计算机 堡垒主机为网络之间的通信提供了一个阻塞点 也可以说 如果没有堡垒主机 网络间将
  • kafka接收消费消息

    三 kafka接收消费消息 本节教程在window下演示 如果是在linux上学习的同学 可以将命令的前缀进行替换即可 比如 window 下的 命令前缀 bin windows kafka topics bat 则linux下的命令前缀为
  • 2023 年你应该知道的 10 个开源项目

    精心策划的 2023 年 GitHub 上最有趣的开发工具和项目列表 1 NetBeans NetBeans 是一个开源的集成开发环境 因其支持多种编程语言和平台而受到开发人员的欢迎 动图 2 OpenCV OpenCV 是一个用于图像和视
  • latex 矩阵_数学作业小工具 MATLAB 到 LaTex

    代码总是能解放生产力 在做数学作业的时候会发现用Word LaTex写矩阵感觉麻烦 同时有时也会因为各种各样的原因写错或者看错 所以我写了一个简单的小脚本可以把MATLAB里的矩阵变成LaTeX代码 直接放到Word或者LaTex编辑器就可
  • Spring Boot 是什么,有什么用。

    见 http www csdn net article a 2016 05 12 15838098 maven Java web bootstrap dataTable app开发QQ群 566862629 希望更多人一起帮助我学习 首先
  • 计算机视觉二 局部图像描述子 SIFT算法

    目录 一 SIFT算法 1 基本介绍 SIFT算法可以解决的问题 2 相关概念 1 尺度空间理论 2 高斯模糊 3 高斯金字塔 4 关键点检测 DOG 5 关键点方向分配 6 关键点描述 7 关键点匹配 二 STFL算法的实现 1 SIFT
  • MATLAB算法实战应用案例精讲-【数据分析】时序异常检测(附实战应用案例)

    目录 前言 算法原理 算法思想 时序异常检测方法 1 统计方法 2 预测方法 机器学习 lt
  • scrapy的深入使用:

    1 区分正常的debug和scrapy中的debug 2 scrapy shell的使用 scrapy shell是scrapy提供的一个终端工具 能够通过它查看scrapy中对象的属性和方法 以及测试xpath 使用方法 scrapy s
  • Python爬虫理论

    目录 1 解析HTML格式 2 解析JSON格式 3 解析二进制格式 4 实战 1 解析HTML格式 解析HTML格式主要有以下几种方法 我们在之后的学习中重点关注前两种 1 lxml库 第三方库 支持HTML和XML格式解析 支持XPat
  • python matplotlib 使用总结

    1 绘制线图 import random import matplotlib pyplot as plt 构造x列表和y列表 x range 100 y random randint 1 10 for i in range 100 plt
  • 为什么晶振处加俩电容?

    晶振是晶体振荡器的简称 在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络 电工学上这个网络有两个谐振点 以频率的高低分其中较低的频率是串联谐振 较高的频率是并联谐振 由于晶体自身的特性致使这两个频率的距离相当的接近 在这个
  • GCC生成静态库.a和动态库.so

    目录 一 静态库和动态库 1 1静态库 1 2动态库 二 GCC生成静态库和动态库 2 1准备过程 2 2静态库的使用 2 3动态库的使用 2 4静态库与动态库的比较 三 库的使用实例 1 代码 2 生成静态库 3 生成动态库 一 静态库和