自己动手写linux静态库文件

静态库与动态库及交叉编译总结及学习较底层编程:动手写一个C语言编译器 C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接、装载与库》。   什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始, 阅读详情

一、概述

1、库文件分为动态库和静态库,在linux下动态库以.so结尾,静态库以.a结尾,但二者都是以lib开头。

2、动态库与静态库的区别在于:如果程序是在编译时加载库文件的,就是使用了静态库。如果是在运行时加载目标代码,就成为动态库。换句话说,如果是使用静态库,则静态库代码在编译时就拷贝到了程序的代码段,程序的体积会膨胀。如果使用动态库,则程序中只保留库文件的名字和函数名,在运行时去查找库文件和函数体,程序的体积基本变化不大。

二、静态库的编写

静态库的编写有两种类型:

类型一:不带头文件的库

A.具体步骤:

a.编写函数代码

b.将A中所编写的函数编译生成目标文件,即.o文件。gcc编译命令为:gcc -c filename

c.利用ar命令对B所得的目标文件归档,生成静态库文件。注意:库文件的名字必须以lib开头,以.a结尾

B.示例程序文件:

//mylib.c

#include<stdio.h>

void myLibFun()

{

printf("my static lib called\n");

}


//test.c

#Include<stdio.h>

int main()

{

myLibFun();

return 0;

}

C.静态库的生成与使用

1.生成目标文件

gcc -c mylib.c

得到一个mylib.o文件

2.用ar命令归档,格式为ar -rc <生成的档案文件名> <.o文件名列表>

ar -rc libtest.a mylib.o

执行完后会生成一个libtest.a文件

3.静态库文件的调用

编译目标文件,注意将静态库的搜索路径加到-L参数里面,把库文件名(去掉打头的lib和结尾的.a)加到-l参数后面。
gcc test.c -o test -L /home/origin -ltest 
此时就会生成一个名为test的可执行文件。

执行./test,输出:

my static lib called

成功了!


三.带头文件的静态库

基本上与上面的一样,但是会有一些区别(红色标注部分)

//mylib.h
void test();

 

//mylib.c 
#inlcude <stdio.h>

void myLibFun()

{

printf("my static lib called\n");

}


//test.c

#Include<stdio.h>

int main()

{

myLibFun();

return 0;

}

静态库的生成与使用:

gcc -c mylib.c

ar -rc libtest.a mylib.o

gcc test.c -o test -l /home/origin -L /home/origin -ltest  //静态库头文件的路径加到-I参数里面

./test

输出:my static lib called

qt 静态库的编译 <br />【QT图形界面编程】如何编译静态Qt库<br />2010-04-12 19:41<br />转载 from http://blog.youkuaiyun.com/johncarmark/archive/2009/10/28/4738158.aspx<br /><br />我在国内外Qt论坛上看到的最多的问题之一就是如何编译静态Qt库,可见在动态链接库(Windows: .dll, Linux: .so)大势所趋的今天,静态链接库还是具有其存在的合理性和广泛需求。首先看看动态库给我们带来了什么:<br /> 阅读详情

相关推荐

linux mircal静态库以及头文件

编译时将libmircal.a -lmircal指定文件目录,以及包含include头文件即可编译成功,或者将静态库放入系统目录下,include/下文件全部放到系统目录include下即可

基于linux的程序库文件打包和调用的实现(一)——静态库文件打包和调用

随着技术的发展,基于linux项目的软件代码越发复杂,原来一个人可以完成的软件项目,现在可能需要多个人合作、多个部门合作、多个企业合作,每个人、每个部门、每个企业可能负责部分软件模块的开发。各个软件模块在调试过程由于涉及企业知识产权、源代码防止修改、安全性等多方面考虑,技术人员会将自己完成的软件生成库文件(含库文件和头文件(.h文件))、接口使用说明供其他模块调用,本文将从通过一个应用程序的例子,介绍linux环境下应用软件库文件的打包和调用过程。

q544344318的博客 1098

linux静态库和动态库

linux静态库和动态库的区别

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

Linux静态库和动态库的制作与使用

AZhi 1236

从二极管到CMOS:手把手教你搭建数字电路中的基础门电路(附原理图)

本文详细介绍了数字电路中基础门电路的搭建方法,从二极管门电路到现代CMOS门电路的设计与实现。通过原理图解析和实战案例,帮助读者掌握数字电路设计的核心知识,包括电平实现、门电路工作原理及实际调试技巧,适合电子技术爱好者和初学者学习参考。

weixin_29252171的博客 321

mac搭建ios自动化环境之WebDriverAgent配置

一、WebDriverAgent 1、简单介绍: WebDriverAgent是facebook为苹果公司开发的一款自动化测试工具,github上有下载资源;另外appium安装后也会自动安装自带的WebDriverAgent;可以用自带的,也可以从github下载并替换自带的; 2、不同appium版本自带WebDriverAgent默认路径不同 1)appium 1.10.1之前版本: npm方式安装: /usr/local/lib/node_modules/appium/node_modules/a

qq_30237715的博客 2763

Linux的动静态库

前缀都是lib,后缀.a表示静态库,.so表示动态库,才是库的名字静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。需要指定的头文件和库文件如果没有默认安装到系统gcc,g++默认的搜索路径下,用户必须指明对应的选项,告知编译器:a.头文件在哪里(大写I选项);b.库文件在哪里(L选项);c.库文件具体的名字(l选项)

zxj20041003的博客 317

vue使用 APlayer+Meting实现音乐播放,支持多平台音乐:网易云、腾讯、虾米、酷狗、百度

  我之前写过一篇博客:使用 APlayer 实现音乐播放器,虽然 APlayer 让我实现了想要的音乐播放器效果,但是音频列表 audio 的音频链接、音频封面、歌词等,是需要自己去补充的。   那么这些数据从哪里来呢?   我昨天有发愁一会儿会儿,也去搜了获取音乐列表的接口,可以发请求去获取数据嘛。   也有瞅见MetingJS,A powerful plugin connect APlayer and Meting,一个连接APlayer和Meting的功能强大的插件,附上GitHub地址:https

小R.的博客 4798

【Linux系统编程】Linux静态库详解

所谓“程序库”,简单说,就是包含了数据和执行码的文件。其不能单独执行,可以作为其它执行程序的一部分来完成某些功能。库的存在可以使得程序模块化,可以加快程序的再编译,可以实现代码重用,可以使得程序便于升级。程序库可分静态库(static library)和共享库(shared library)。不管是Linux还是Windows中的库文件其本质和工作模式都是相同的, 只不过在不同的平台上库对应的文件格式和文件后缀不同。程序中调用的库有两种静态库和动态库。

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 2135

ICS v9.5 OverbyteIcsWSocket.pas 整体架构分析

核心架构:OverbyteIcsWSocket.pas 是 Internet Component Suite (ICS) 的基础网络组件单元,提供跨平台 Winsock API 封装,支持TCP/UDP 客户端/服务器,DNS 解析和Raw Socket。在 v9.5 中,SSL/TLS 代码已分离至 OverbyteIcsSslBase.pas 等单元,使核心单元更精简,专注于非加密 socket 操作。

sonadorje的专栏 994

高功率半导体叠阵激光快慢轴准直优化技术解析

本文深入解析了高功率半导体叠阵激光快慢轴准直优化技术。针对其光束发散特性,文章系统阐述了从光源建模、光学仿真到透镜选型与参数匹配的完整工程流程,并强调了光束整形对于提升加工精度与效率的核心作用。通过优化快慢轴准直,可将原始散光转变为能量集中、均匀性好的高质量光束,为后续工业应用奠定基础。

php55的博客 713

Linux 文件系统:动静态库

Linux 文件系统:动静态库

Han同学 1855

数据结构实验1.2—高精度计算PI值(西工大)

这是数据结构第二题的题目,是让我们根据用户的需求来计算派的值 这是题目的详细描述,刚看到这道题的时候,我是真的头大,完全没有思路,于是查找了一些大佬的笔记后才开始编写 这是我在写这些代码是所运用到的数学反三角函数幂次展开式的知识。 下面是正确的代码以及我的一些见解,和需要注意的一些地方。希望能对你有所帮助。如有更加精简的算法,请在评论区留下你的算法!!!谢谢!!! #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdl

abcdef0623的博客 5831

Linux 之三 静态库及动态库的编写和使用

静态库 静态库文件的扩展名一般为 .a,其编写步骤很简单。 ⑴编写函数代码 ⑵编译生成各目标文件 ⑶用ar文件对目标文件归档,生成静态库文件。 注意:归档文件名必须以lib打头。 使用要点: ⑴在gcc 的-I参数后加上静态库头文件的路径。 ⑵在gcc 的-L参数后加上库文件所在目录 ⑶在gcc 的-l参数后加上库文件名,但是要去掉lib和.a扩展名。比如库文件名是libtest.a 那么参数就是 -l test 2、编写最简单的静态库文件 编写如下两个文件,注意放在同一目录中 //myalib.h 文件的

技术干货 1893

【LangChain编程:从入门到实践】实现多模态代理

【LangChain编程:从入门到实践】实现多模态代理 关键词:LangChain, 多模态代理, 自然语言处理, 机器学习, 知识图谱, 对话系统, 代码生成, AI代理 1. 背景介绍 随着人工智

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 581

LeRobot 入门教程(十一)π0(Pi0)π0.5(Pi0.5)训练、推理、部署

本文介绍了Physical Intelligence公司开发的π₀和π₀.₅系列通用机器人控制视觉-语言-动作模型。π₀作为首款基础模型,融合流匹配、跨实体训练等技术,支持50Hz高频控制。π₀.₅是其升级版,通过异构数据协同训练解决开放世界泛化问题,在Libero基准测试中表现优异。文章详细说明了两个模型的安装要求、使用方法、训练策略及关键参数配置,包括混合精度训练、梯度检查点等优化技术,为机器人在多样化场景中的语义理解和动作控制提供了完整解决方案。

2506_90492529的博客 5052

Linux:动静态库全面分析

本文全面介绍了Linux下的动静态库,从制作到使用详细解析了两者的区别。静态库(.a)在编译时被拷贝到可执行文件,而动态库(.so)在运行时加载,支持多程序共享。文章通过数学库实例演示了如何制作静态库(使用ar命令)和动态库(需要-fPIC选项),并解释了动态库必须使用位置无关代码的原理。最后针对动态库运行时加载问题,提供了四种解决方案,包括修改环境变量、系统配置等方法。通过本文,读者可以深入理解Linux库的工作机制和实际应用场景。

2402_87867439的博客 879

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

一文搞懂 Linux 动静态库:从制作到加载原理,小白也能看懂

本文介绍了Linux系统中库的概念与使用方法,重点讲解了静态库和动态库的制作流程及底层原理。静态库(.a)会在编译时拷贝到程序中,使程序独立运行;动态库(.so)则运行时加载,支持多程序共享。文章详细演示了从编写简单库函数到编译打包的全过程,包括解决动态库路径问题的四种方案。通过分析ELF文件格式,解释了程序加载库的机制,特别是动态库使用的GOT表重定位技术。最后对比了两种库的优缺点:静态库移植性好但体积大,动态库节省资源但依赖环境。建议读者动手实践,使用readelf、ldd等工具加深理解。

zrt123456i的博客 988

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

静态库与动态库总结

soname在链接和加载库文件时使用,当时使用-l$(name)链接库文件时,链接器会读取lib$(name).so文件中的soname值,并将其记录在生成的程序中,当运行程序时,会从相应的目录加载名为$(soname)的文件,所以,在运行程序之前,$(soname)的库文件必须已生成。例如,C 语言库文件提供有大量的函数(如 scanf()、printf()、strlen() 等),C++ 库文件不仅提供有使用的函数,还有大量事先设计好的类(如 string 字符串类)。

bluewhu的博客 1187

VC中sqlite的使用

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

linux编译c++ 静态库,C/C++ 条件编译静态库

==》windows 下方法:1.方法一:VS工程中中直接添加1.1在VS的属性-》常规-》附加库目录,添上文件夹的路径:例如:lib/x64;1.2输入的附加依赖项,添加上库的名字,例如:dmapi.lib1.3 对用到该库的代码进行,宏包含,例如:#ifdef LOG_XY...#endif1.4 当你在工程编译时,在c/c++-》预处理器-》预处理器定义,中未定义LOG_XY 时,就不会依赖...

weixin_32927133的博客 590

linux动态库和静态库_如何在Linux中处理动态和静态库

linux动态库和静态库 从某种意义上讲,Linux是一系列相互依赖的静态和动态库。 对于基于Linux的系统的新用户,库的整个处理可能是一个谜。 但是根据经验,编写新应用程序时,内置于操作系统中的大量共享代码可能是一个优势。 为了帮助您与该主题保持联系,我准备了一个小应用程序示例 ,该示例显示了在常见Linux发行版上可用的最常用方法(这些方法尚未在其他系统上进行测试)。 要使用示例应用程...

cumo3681的博客 437

linux静态库与共享库(一)

1 引言 软件设计中有一条原则是模块化,当一个项目达到一定规模时,往往将模块编译成库的形式,这也有利于分工协作。在linux中库分为静态库和动态库。静态库,是在可执行程序链接时就已经将该库的代码链入到可执行程序中,在物理上成为执行程序的一部分,使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生成的可执行文件较大。动态库,是在可执行程序启动时动态加载到执行程序中,可以被多个可执行程序

hmalloc的专栏 943

.so文件之于Linux

Linux下的.so文件什么是链接不同系统下的动态链接库C语言中的静态库和动态库查看.so文件信息Linux命令LINUX下C++生成.so文件及编译生成可执行文件的过程 什么是链接 即使一个非常简单的程序,也需要依赖C标准库和系统库,链接其实就是把其他第三方库和自己源代码生成的二进制目标文件融合在一起的过程。经过链接之后,那些第三方库中定义的函数就能被调用执行了。早期的一些操作系统一般使用静态链接的方式,现在基本上都在使用动态链接的方式。 静态链接在链接的时候,就把所依赖的第三方库函数都打包到了一起,导致

Yuan_YuPeng的博客 666

深入浅出:手把手教你制作与使用C语言静态库

本文详细介绍了静态库的概念、工作原理及实战制作流程。静态库是预先编译好的目标代码集合,在编译时被完整嵌入到可执行文件中,具有执行效率高、独立性强等优点,但也存在体积大、更新困难等缺点。通过创建包含加减法功能的数学库libmymath.a,演示了从编写源代码到编译打包,再到链接使用的完整过程。验证了静态库的自包含特性,即使删除库文件,程序仍能正常运行。最后总结了静态库的适用场景和优缺点,为后续学习动态库奠定了基础。

Web安全工具库 960

Linux下合并静态库(.a文件)的完整指南:原理、工具与工程实践

在C/C++开发中,静态库(.a文件)是代码复用的重要形式,它将预编译的目标文件(.o)打包归档,供链接器在编译时直接整合到最终可执行文件中。其核心原理是通过ar工具创建归档文件,并利用ranlib生成符号索引以提升链接效率。这项技术的核心价值在于简化大型项目的依赖管理和分发流程,通过将多个零散的静态库合并为单一文件,能显著减少链接命令的复杂度,避免遗漏依赖,并提升SDK发布的便利性。尤其在Linux环境下的嵌入式系统、跨平台库分发及遗留代码维护等场景中,合并静态库是一种提升工程规范性的实用技巧。本文将结合

weixin_28829325的博客 211

【入门教程】Linux下静态库和共享库的制作方法

在Linux环境下编写程序时,经常会调用glibc库中的API。这些库是如何实现的的呢?很多初学者对此一直很困惑,接下来就与大家一起动手练习一下静态库和共享库的制作方法。       作者:沧海猎人   出处:http://blog.youkuaiyun.com/embedded_hunter  转载请注明出处   嵌入式技术交流QQ群:179012822       首先,我们编写代码来实现“输入半径求

沧海猎人的学习之路 4558
上一篇: centos6.2挂载NTFS
下一篇: 【条款5】know what functions C++ silently writes and calls
traceorigin
博客等级 码龄15年 38粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值