静态库 & 动态库

https://blog.youkuaiyun.com/mahoon411/article/details/113565482

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

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

Linux 中有两种:

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

动态库

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

ld: linker and editor
.so: shared object file
Linux 上的可执行文件是 ELF(executable and linkable file) 格式

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

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

动态库名称:libxxx.so

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

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

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

https://blog.youkuaiyun.com/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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值