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

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

相关推荐
troy1281 小时前
Python 基础语法(一):变量、数据类型与运算符
java·服务器·python
宵时待雨1 小时前
linux笔记归纳19:网络层协议IP
linux·网络·笔记·网络协议·tcp/ip
程序员清风1 小时前
记忆系统设计:让 Agent 拥有短期记忆与长期记忆
java·服务器·网络
做运维的阿瑞2 小时前
Linux下DNS服务器搭建
linux·运维·服务器
团子股股东峥哥2 小时前
day37-RHEL-管理基本存储
linux·运维·服务器
en.en..2 小时前
TCP/IP四层模型「数据包封装与拆包」| 网络传输
服务器·网络·php
君生我老2 小时前
Linux inode概念 &软硬连接
linux·服务器
Android系统攻城狮3 小时前
Linux Gstreamer深度解析之gst_audio_converter_reset调用流程与实战(二十一)
linux·运维·服务器·gstreamer音视频·音视频进阶
youyou-06063 小时前
AUTOSAR‑COM 常见问题 QA (1)
java·linux·服务器·单片机·汽车