linux系统下动静态库的制作

Vivado与Vscode无缝集成:高效Verilog开发环境搭建指南 本文详细介绍了如何将Vivado与Vscode无缝集成,打造高效的Verilog开发环境。通过替换Vivado默认编辑器为Vscode,配置必备插件和语法检查工具,开发者可以大幅提升FPGA项目的编码效率。文章还提供了代码片段、Testbench自动生成等高级技巧,帮助开发者快速上手这一集成方案。 阅读详情

库: 就是代码编译出来的一种形式 
动态库,静态库

动态库: win系统上的dll文件, lin系统上的so文件.
代码编译成一个独立的库, 不专属于一个程序.任何程序都可以共用这个库. 这个库不管多少程序调用,只要在内存里存在一份就可以了

静态库: win上的lib文件, linux上的.a文件
静态库只能与其它的代码一起编译链接生成一个程序,不能像动态库作为一个独立的库使用. 如果多个程序使用这个静态库,
意味着多个程序里都得包含有这个库的代码.

动态库的优点: 多个程序共用时, 只需加载库的一个副本到内存中即可,
相对于静态库来说节省内存. 改变库里的算法时(函数名不能随便变),不会影响使用此库的程序. 动态库还可以多个版本共存
缺点: 发布程序时,需要连同动态库一起发布

静态库的优点:因静态库是与其它代码一起编译链接成一个程序的,所以发布这个程序时,不需要额外发布这个库
缺点: 多个程序使用时, 每个程序都得包含有这个库的代码, 相对于动态库来说浪费了空间, 并且库升级后, 程序需重新编译

静态库的生成:

1. 写库的功能代码:  hello2.c , hello.c,  hello.h
	头文件里定义类型,声明函数

2. 编译hello2.c,  hello.c生成.o文件
	gcc  hello.c -c -o hello.o -fPIC // -c 指只编译不链接, -o hello.o编译生成hello.o文件, -fPIC指定编译生成的代码是内存地址无关的代码.
 
	gcc  hello2.c -c -o hello2.o -fPIC


3. 把所有.o文件打包成一个.a文件
	ar -cr libhello.a  hello.o hello2.o 

///使用静态库: 
	gcc test.c -lhello -L ./ -I ./    /* -lhello指定使用libhello库, -L指定库所在的目录, -I 指定头文件的所在目录 */

	gcc test.c ./libhello.a -I ./    /*也可以这样编译链接*/

动态库生成:
1. 写库的功能代码:  hello2.c , hello.c,  hello.h
	头文件里定义类型,声明函数
	

2. 把hello2.c, hello.c编译成动态库
   gcc hello2.c hello.c -shared -fPIC -o libhello.so -I ./

///使用动态库:
	编译时: gcc test.c -I ./ -lhello -L ./
	
	程序执行时,如果报找不到库的错误时的解决方法:
	
	1).可以把库放入下面的目录里
	64位系统:  /lib64;  /usr/lib64;  /usr/local/lib64
 	32位系统:  /lib;    /usr/lib;    /usr/local/lib

	2). 配置环境变量
	    export LD_LIBRARY_PATH=./ 
	    再执行程序: ./a.out

	3). 配置动态库的加载路径(vim /etc/ld.so.conf)
	    直接把库的所在路径写到/etc/ld.so.conf文件里
	    然后更新: ldconfig
              
        4). 编译时直接指定库的所在路径
	    gcc test.c ./libhello.so -I ./   /*这样,只要库与程序同一目录即可 */

//////////
用代码来加载动态库. 
	//dlopen加载filename指定的动态库到内存上, flag指定解析库里函数的地址等行为
	void *dlopen(const char *filename, int flag);
	用法 void *handle = dlopen("库名", RTLD_LAZY);
	
        //查找库里函数的所在的内存地址. handle为dlopen得到的地址, symbol为函数名.成功则返回函数地址
       void *dlsym(void *handle, const char *symbol);

	//告诉系统,本进程已不再使用此库. 如果这个库没有其它进程使用,系统会把这个库从内存上去掉
       int dlclose(void *handle);

       Link with -ldl.

//////////////////////////////////////////////
注意,如在C++程序里使用C实现的动态库,则需要声明哪些函数是由C代码实现。
因为在C程序里,源程序里的函数名编译完后函数名是不会变的。
       在C++程序里,源程序的函数名编译完后会生成的函数名除了原名外还与参数的类型及个数有关.
在C++里声明C动态库里的函数:

extern "C" {
   #include <mylib.h>; //包含C实现的动态库头文件
    void func(); //声明函数

}


【unity实战】使用unity的Navigation+LineRenderer实现一个3D人物寻路提前指示预测移动轨迹的效果,并可以适配不同的地形 本文介绍了在Unity中使用Navigation导航系统和LineRenderer实现3D人物寻路轨迹预测效果的方法。通过NavMesh.CalculatePath计算路径点,结合Physics.Raycast进行地面点投射,将路径点赋予LineRenderer渲染出移动轨迹。关键点包括:1)利用NavMesh.CalculatePath计算两点间可行走路径;2)通过射线检测获取地面点提高路径适配性;3)使用协程定期更新路径绘制。文章还提供了完整代码实现,并说明需要将地面图层设置为Ground并进行导航网格 阅读详情

相关推荐

USB3.0一致性测试方案

为各测试项目具体测试结果包括脉冲串突发时间、脉冲串重复时间、时钟周期以及眼图等完整USB3.0测试项目,工程师可以看到各项测试的具体结果方便观察。RIGOL 提供了一套完善的工具,包括数字示波器、专业的测试夹具以及全自动一致性测试软件,使得USB 3.0设备设计人员能够高效精确地进行信号捕捉、测试与分析。报告第二部分测试摘要,在此可以看到USB3.0测试所有测试项目,并且可以观看到测试是否正常,可以帮助工程师更好的判断测试结果。,以简化下载、存储以及对于多媒体的大量内容的共享。

2409_87378937的博客 2526

mmap函数详解(what?why?how?)

主要对mmap函数进行了较为详细的介绍

shark_93的博客 1万+

DSP在线升级方案:TMS320C6678使用网络或者串口输出升级数据进行固件升级

下面这段先引用创龙的说明 IBL 运行后, 将从 NOR FLASH 或 NAND FLASH 的 0x00080000 地址引导 ELF/BBLOB 格式 用户程序。 当引导 ELF 格式用户程序时, IBL 会解析用户程序头部信息,并根据头部信息 拷贝不同的代码段至指定 CPU 内存地址,然后将 PC 指针跳转至_c_int00, 再运行用户程 序。当引导 BBLOB 格式用户程序时,由于无头部信息, IBL 会将用户程序拷贝至 0x9E000000 (该内存地址为 IBL 代码指定),并将 PC..

ToneChip的专栏,一个传统的嵌入式码农,裸机编程 1941

mmap函数的详细讲解

addr如果addr为NULL,内核会自动选择一个起始地址作为映射的起点。如果addr不为NULL,则内核会尝试将映射放置在指定的起始地址处。如果指定的地址无效或与已有映射冲突,则mmap()调用会失败。通常情况下,最常用的做法是将addr设置为NULL,由内核选择一个适当的地址。lengthlength参数指定要映射的长度,可以是文件的长度或者是页的整数倍。对于文件映射,length一般为文件大小。对齐到页面大小可以获得最佳性能,因为页面是内存管理的最小单位。protprot。

weixin_74128452的博客 5474

基于ASP.NET+SQLServer的美妆网站的设计与实现

通过本次ASP.NET MVC美妆商城项目的开发,我们实现了一个功能完善、性能稳定的在线购物平台。该项目不仅提升了用户的购物体验,也为商家提供了一个高效的商品管理和销售渠道。未来,我们将持续优化系统功能,提升用户体验,以适应不断变化的市场需求。

毕业设计大牛哥 1497

手把手拆解UCIe协议层:从Raw Mode到Flit Mode,数据包到底经历了什么?

本文深入解析UCIe协议层的数据包处理机制,从Raw Mode到Flit Mode的三大变体(Standard 256B、68B-Enhanced、Latency-Optimized),详细揭示数据包在不同模式下的封装与转换过程。通过工程师视角,展示协议层如何实现多模式动态切换、错误恢复及与D2D Adapter的协同设计,为芯片级互连技术提供实践指导。

weixin_28728495的博客 238

Linux系统编程 —共享内存之mmap

共享内存概念 共享内存是通信效率最高的IPC方式,因为进程可以直接读写内存,而无需进行数据的拷备。但是它没有自带同步机制,需要配合信号量等方式来进行同步。 共享内存被创建以后,同一块物理内存被映射到了多个进程地址空间,当有一个进程修改了共享内存的数据,其余的进程均可看见所修改的内容,反之亦然。 mmap函数 函数原型: void *mmap(void *adrr, size_t length, int prot, int flags, int fd, off_t offset); 返回值: 成功:返回创建

码到成功 1395

【OpenClaw从入门到精通】第45篇:Skill供应链安全——如何识别并避开恶意技能插件?(2026实测版)

随着OpenClaw生态爆发式增长,全球Skills总量近75万个,日均新增2.1万个,但恶意/问题插件已超600个,数十万用户受影响。本文基于奇安信威胁报告及360安全实践,拆解恶意技能的五大核心特征,提出"安装前三步法"安全审查流程,详解安全技能来源白名单与定期审计方案,并深度解析360龙虾Skill安全超市的分级认证机制。读者可掌握从技能筛选、安装审查到术后审计的全流程安全防护手段,通过实操命令与案例演示,零成本构建Skill供应链安全防线,避免遭遇私钥窃取、资产损失等安全事件。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 561

mmap函数的用法详解及实例分析

1、mmap函数是一个比较神奇的函数,它可以把文件映射到进程的虚拟内存空间。通过对这段内存的读取和修改,可以实现对文件的读取和修改,而不需要用read和write函数。如下图所示,为mmap实现原理的示意图。 在这个图中,off为映射的部分在文件中的偏移量,len为映射的长度。 2、下面我们来看一下mmap函数的原型 void *mmap(void *addr, size_t len,...

bigmarshal的博客 2万+

硬件工程师的破局之路:为何你才是考取软考高级架构师的“天选之子”?

硬件工程师如何转型系统架构师:独特优势与实战路径 文章揭示了硬件工程师在考取系统架构设计师证书时的独特优势。作者指出,硬件工程师的全局思维、接口设计能力和可靠性经验正是系统架构的核心要素。通过将硬件经验升维为架构思维(从引脚到接口、从单板到系统、从实现到权衡),硬件背景反而成为竞争优势。文章建议通过知识补全、建立架构决策日志和术语转换练习来备考,并强调硬件工程师在软硬协同时代的独特价值——既能统领硬件设计,又能为软件搭建最佳舞台。文末鼓励硬件工程师以更高视野看待职业发展,将系统架构师认证视为水到渠成的职业升

云轩阁 532

深入Scrapy ItemLoader:打造优雅高效的Python爬虫数据清洗流水线

ItemLoader是 Scrapy 提供的声明式数据加载工具。它的核心理念是:将数据提取(从response中取原始值)和数据清洗/验证(处理空值、格式转换、默认值等)分离开。你可以把它想象成一个工厂流水线:原始零件(selector提取的文本)进入,经过一道道工序(输入处理器),组装成最终产品(Item字段)。首先在items.py中定义清晰的数据结构。使用搭配类型注释(虽然Scrapy自身不强制,但对人和IDE友好)。

2201_76125261的博客 68

Linux mmap系统调用

Linux mmap系统调用简介以及其使用

小立仔 5173

Dify 第 14 篇 Dify 知识库改造案例,如何返回完整文档?

在使用Dify社区版v1.7.1的知识库功能时,遇到检索仅返回匹配的文本片段而非完整文档的问题。针对运维案例知识库的需求,尝试了三种解决方案: 调整Chunk大小:通过设置最大分段长度为4000字符,但无法满足超过该长度的文档需求。 增加返回Chunk数量:通过调整Top K参数,但最大仅支持10个片段,且可能包含无关内容。 调用知识库API:通过检索接口获取匹配文档ID,再查询该文档所有分段内容,从而获得完整信息。具体步骤包括生成API密钥、获取知识库ID,并通过HTTP请求实现。 最终推荐采用AP

甘蓝的专栏 1968

【Linux系统】动静态库的制作

本文介绍了Linux系统中动静态库的制作与使用。静态库通过ar工具将.o文件打包成.a文件,使用-L指定库路径,-l指定库名进行链接。动态库使用gcc的-fPIC和-shared选项生成.so文件,运行时需配置系统查找路径(软连接、环境变量或ldconfig)。静态库在编译时链接,而动态库在运行时加载。文章还说明了头文件和库文件的默认系统路径,以及如何将自定义库安装到系统中以便简化调用。

记录学习与成长 1365

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

动静态库的制作与使用(Linux操作系统)

首先准备好需要做成库的源文件与头文件,如下示例:注意:在制作库方法过程中不能有main函数。如果代码使用c语言进行写的,执行以下语句把所有.c文件进行编译得到了.o文件。gcc -c *.c使用ar指令把所有.o文件链接成静态库,如下:-r(replace):此选项表示在插入文件到库时,若遇到同名的成员,则进行替换。它确保了库中的文件是最新的。-c(create):这个选项用于创建一个新的库文件。如果指定的库文件已经存在,它并不会被覆盖,而是会报错提示文件已存在。

2302_80105876的博客 1271

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Linux系统】精通动静态库的制作和使用

今天讲解动静态库的制作与使用规则,静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking) 动态库可以在多个程序间共享,所以动态链接使得

2302_78684687的博客 792

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

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

Linux系统:动静态库的制作与安装

本文介绍了Linux系统中库的基本概念与分类,包括静态库(.a)和动态库(.so)两种形式。详细阐述了静态库的创建步骤:编写源代码、编译为目标文件(.o)、使用ar命令打包,以及使用-I、-L、-l选项链接静态库的方法。对于动态库,重点说明了如何通过-fPIC生成位置无关代码和-shared选项创建动态库,并提供了4种安装方法以满足不同需求。最后对比了动静态库在链接时机、文件大小、更新维护等方面的核心差异,为开发者选择适合的库类型提供了参考依据。

yue_2899799318的博客 1608

【Linux文件系统】动静态库:从原理到制作

本文介绍了动静态库的基本概念、制作方法及使用方式。静态库(.a/.lib)通过直接拷贝代码实现到程序中,而动态库(.so/.dll)在运行时加载到内存供程序共享。制作静态库需使用ar打包目标文件,动态库则通过gcc -shared生成位置无关码。使用时需通过-I、-L、-l选项指定头文件路径、库路径及库名。动态库还涉及运行时加载问题,可通过环境变量或系统路径解决。动态库的共享特性节省了内存空间,其实现与进程地址空间密切相关。

2401_87944878的博客 1万+

动静态库【Linux操作系统】

例第三方库:libsss.a。

2301_80058734的博客 1004

【Linux系统】动静态库的制作 与 原理

一、动静态库的介绍 和 使用(编译器链接时默认动态链接) 二、ELF文件格式 及 查看方法(对比各类型ELF文件 ELF头的区别) 三、理解链接与加载过程

无限进步!!! 1563
上一篇: 01 ffmpeg对摄像头的调用编程
下一篇: linux下开发必备的工具
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值