Linux动静态库

文章目录

什么是库

  • 静态库:.a Linux .lib windows
  • 动态库:.so Linux .dll windows

静态库

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库。
  • 一个可执行程序可能用到许多的库,这些库运行有的是静态库,有的是动态库,而我们的编译 默认 为动态链接库,只要在该库下找不到动态.so的时候才会采用同名静态库。我们也可以使用gcc的 -static 强制设置链接静态库。

静态库生成

  • ar:创建静态库的工具
  • -r(replace):将文件插入库中(替换已存在的同名文件)
  • -c(create):创建库时不显示警告信息
shell 复制代码
  1 libmyc.a:mystdio.o mystring.o
  2     ar -rc $@ $^
  3 mystdio.o:mystdio.c
  4     gcc -c $<
  5 mystring.o:mystring.c
  6     gcc -c $<
  7 
  8 .PHONY:output
  9 output:
 10     mkdir -p lib/include
 11     mkdir -p lib/mylib
 12     cp -f *.h lib/include                                                                                                                                                                                     
 13     cp -f *.a lib/mylib
 14     tar czf lib.tgz lib
 15 
 16 .PHONY:clean
 17 clean:
 18     rm -rf *.o libmyc.a lib lib.tgz

myfile.c

  先写一个测试文件进行测试,我们引入了一个自己写的头文件 mystring.h(里面只写了一个函数 my_strlen) 只引入怎么实现,但具体的实现我不说出来,直接运行一下代码,看一下会出什么问题。

cpp 复制代码
  1 #include"mystring.h"
  2 #include<stdio.h>
  3 int main(){
  4     const char *s = "abcdefg";
  5     printf("%s: %d\n",s,my_strlen(s));
  6     return 0;
  7 }                                                                                                  

运行结果

  发现找不到这个函数是怎么实现的。

解决以上问题

  • -L:指定库路径
  • -I:指定头文件搜索路径,不用指定到库(指定到库就是文件了)
  • -l:指定库名
  • 库文件名称和引入库的名称:去掉前缀lib,去掉后缀.so , .a 如:libmyc.a -> myc
  • 场景一:头文件和库文件安装到系统路径下
shell 复制代码
gcc -o myfile myfile.c -lmyc
  • 场景二:头文件和库文件和我们自己的源文件在同一路径下
shell 复制代码
gcc -o myfile myfile.c -L. -lmyc

运行结果

  • 场景三:头文件和库文件有自己的独立路径
shell 复制代码
gcc -o myfile myfile.c -I./lib/include -L./lib/mylib -lmyc

运行结果

动态库

  • 动态库(.so):程序在运行的时候才去链接动态库的的撒艾玛,多个程序共享使用库的代码。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
  • 在可执行文件开始运行之前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采样虚拟内存允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

动态库生成

  • shared:表示生成共享库格式
  • fPIC:产生位置无关码
  • 库名规则:libxxx.so
shell 复制代码
  1 libmyc.so: mystring.o
  2     gcc -shared -o $@ $^                                                                                                                                                                                      
  3 mystring.o:mystring.c
  4     gcc -fPIC -c $<
  5 
  6 .PHONY:output
  7 output:
  8     mkdir -p lib/include
  9     mkdir -p lib/mylib
 10     cp -f *.h lib/include
 11     cp -f *.so lib/mylib
 12     tar czf lib.tgz lib
 13 
 14 .PHONY:clean
 15 clean:
 16     rm -rf *.o libmyc.so lib lib.tgz

动态库使用

头文件和库文件和我们自己的源文件在同一路径下。

shell 复制代码
gcc -o myfile myfile.c -I. -L. -lmyc

函数找不到!!!

解决办法:临时拷贝到环境变量里面。

shell 复制代码
LD_LIBRARY_PATH=. ./myfile

觉得我回答有用的话,记得点个关注哟!谢谢支持!

相关推荐
科研邪修法41 分钟前
培训PDF保护配置:把需求转换成可验收权限
linux·服务器·网络
Felven1 小时前
中科驭数100G网卡RDMA性能测试
linux·rdma·中科驭数·100g网卡
Lansonli3 小时前
大数据Spark(八十八):Spark任务资源之Standalone集群测试
java·服务器·spark
雪落漂泊4 小时前
Liunux进程(七):程序控制篇(中)
linux·运维·windows
俊俊几年的4 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c
星恒随风13 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
可乐ea16 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
唐墨12317 小时前
linux kernel 比较数据大小的宏定义
linux·算法
程序开发阿元17 小时前
密码不进工具:一个独立开发者的服务器凭据管理办法
linux·ssh
真好啊又活了一天20 小时前
服务器和虚机配置IPV6
运维·服务器·github