静态库 动态库

embedded/2024/11/14 19:10:21/

https://blog.csdn.net/mahoon411/article/details/113565482

库:可执行代码的二进制文件,里面有可以直接使用的函数,变量等;不能单独运行

  • 因为 Linux 和 Win 的链接器、汇编器、编译器的不同,相同代码的库不同

Linux 中有两种:

  • 静态库:在主程序链接库的时候,静态库被直接写入主程序,会极大增加主程序体积
  • 动态库:在主程序链接库的阶段只是在主程序中加入库的标记,在主程序运行时,动态库会被加载到内存中供主程序调用,不会增大主程序体积

动态库

动态库文件在运行时候载入主程序,由动态库载入器 ld-linux.so 程序完成,先后搜索 ELF 文件的

DT_RPATH段→环境变量LD_LIBRARY_PATH→/etc/ld.so.cache文件列表→/lib/或/usr/lib目录

直到找到库文件,然后将其载入内存。

  • Linux 上的可执行文件是 ELF(executable and linkable file) 格式

动态库名称:libxxx.so

动态库的使用和链接器的搜索路径有关,如果只是临时需要,可以添加 LD_LIBRARY_PATH 变量

如果是永久变量,可以添加到 .bashrc 文件

不推荐添加到 /lib 或 usr/lib 文件夹内,因为很可能覆盖原有的文件

https://blog.csdn.net/mahoon411/article/details/113565482

动态库加载失败:cannot open shared object file: No such file or directory

静态库

命名规则:libxxx.a

  • 制作过程:
    1. 通过 gcc 编译器编译 .c 文件成 .o 文件

    2. 使用 ar(archive 等工具)将 .o 文件打包成 .a 文件

      ar libxxx.a xxx.o xxx.o

报错 found _add in lib/libcalc.a(add.o), declaration possibly missing extern "C”(extern “C”)

如果是 .cpp 文件,和 .c 文件编译链接在一起,就会报错

这里的树形结构是

在这里插入图片描述

  • app 是可执行文件
  • main.cpp 主程序

按照步骤

  1. gcc -c add.c
  2. ar rcs libcalc.a add.o
  3. mv libcalc.a …/lib
  4. gcc -o app main.cpp -L lib -l calc -I(i大写) include

报错

  • gcc 编译器报错

/usr/bin/ld: /tmp/cc3NjJG6.o: in function main':

main.cpp:(.text+0x54): undefined reference to add(int, int)’
collect2: error: ld returned 1 exit status

  • clang 编译器下报错 (就这么看,clang 编译器是更优秀的)

在这里插入图片描述

需要更改 head.h 为

#include "stdio.h"
extern "C"
{int add(int a, int b);
}

表明是 c 函数,要求编译器以 c 的标准编译 add()


http://www.ppmy.cn/embedded/113504.html

相关文章

QT<24> Qt和windows中获取CPU序列号号以及主板序列号

前言:在qt中获取CPU和主板唯一序列号,可以在程序构造函数中判断是否与windows中一致,不一致可以直接退出程序,防止程序daoyong。 一、获取电脑CPU唯一序列号 QString MainPage::get_cpu() {QString cmd"wmic cpu get proc…

计算机组成原理-存储系统(二)半导体存储器

2.1DAM芯片 分类: DRAM芯片:使用栅极电容存储信息SRAM芯片:使用双稳态触发器存储信息 核心区别:储存元不一样 2.2DRAM和SRAM的比较 对于DRAM中: 1:电容内存储了电荷0:电容内未存储电荷 DR…

【百日算法计划】:每日一题,见证成长(016)

题目 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环 思路1 用哈希表的思想&#xff0c;遍历链表&#xff0c;判断节点在哈希表中是否存在。 public boolean hasCycle2(ListNode head) {HashSet<ListNode> hashSet new HashSet<>();ListNo…

VS2022中的调试

目录 前言&#xff1a; 使用&#xff1a; 调试&#xff1a; 前言&#xff1a; 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。…

Vue3+TypeScript+Vite+Less 开发 H5 项目(amfe-flexible + postcss-pxtorem)

参考文档 amfe-flexible&#xff1a;将根元素 html 的字体大小 fontSize&#xff08;1rem&#xff09; 设为 viewWidth / 10&#xff0c;以适配不同终端 postcss-pxtorem&#xff1a;将 px 单位转换为 rem 单位 安装依赖 pnpm add amfe-flexible pnpm add postcss-pxtorem …

微信 SDK、NCF 、CO2NET、Senparc.AI 近期重大更新,欢迎解锁

◾️更新基础库&#xff0c;包括缓存、APM、CO2NET 核心模块等全面升级&#xff1b; ◾️更新支付接口调用过程中的 SM&#xff08;国密&#xff09;和 RSA 判断方式&#xff1b; ◾️更新微信 SDK 接口 Senparc.Weixin SDK ✍️v2024.9.10 更新基础库&#xff0c;包括缓…

代码随想录算法训练营第五十八天 | 拓扑排序精讲-软件构建

目录 软件构建 思路 拓扑排序的背景 拓扑排序的思路 模拟过程 判断有环 写代码 方法一&#xff1a; 拓扑排序 软件构建 题目链接&#xff1a;卡码网&#xff1a;117. 软件构建 文章讲解&#xff1a;代码随想录 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文…

【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题三

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…