linux库制作

发布时间:2026/11/5 3:52:18
linux库制作 文件目录1. 什么是库2.静态库2.1 静态库的生成2.2 静态库使用3. 动态库3.1 动态库生成3.2 动态库使用3.3 库运行搜索路径3.3.1 问题3.3.2 解决方案1. 什么是库库是写好的现有的成熟的可以复用的代码。现实中每个程序都要依赖很多基础的底层库不可能每个人的代码都从零开始因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式可以被操作系统载入内存执行。库有两种静态库 .a [Linux]、.lib [windows]动态库 .so [Linux]、.dll [windows]2.静态库静态库.a程序在编译链接的时候把库的代码链接到可执行文件中程序运行的时候将不再需要静态库。一个可执行程序可能用到许多的库这些库运行有的是静态库有的是动态库而我们的编译默认为动态链接库只有在该库下找不到动态.so的时候才会采用同名静态库。我们也可以使用gcc的-static 强转设置链接静态库。2.1 静态库的生成//Makefile 1 libtest.a:test.o mystring.o 2 ar-rc $ $^ 3%.o:%.c 4 gcc-c $ 5 6.PHONY:clean 7 clean: 8rm-rf*.a*.o stdc* 9 10.PHONY:output 11 output: 12 mkdir-p mylib 13 mkdir-p mylib/include 14 mkdir-p mylib/lib 15 cp-f*.h mylib/include 16 cp-f*.a mylib/lib是gnu 归档工具rc 表示(replace and create)[zhangsanVM-0-17-centos 2026-11-3]$ ar-tv libtest.a rw-rw-r--1003/1003 1496 Nov 3 18:07 2026 test.o rw-rw-r--1003/1003 1520 Nov 3 18:07 2026 mystring.ot: 列出静态库中的文件v :verbose 详细信息2.2 静态库使用1//任意目录下新建 2//main.c引入库头文件 3#include test.h4#include mystring.h5 6 int main()7{8 Print();9 mystring();10return1;11}//场景1头文件和库文件安装到系统路径下 $ gcc main.c-lmystdio//场景2头文件和库文件和我们自己的源文件在同一个路径下 $ gcc main.c-L.-lmymath//场景3头文件和库文件有自己的独立路径 $ gcc main.c-I头文件路径-L库文件路径-lmymath gcc main.c-I mylib/include-L mylib/lib-l test-L :指定库路径-I : 指定头文件搜索路径-l :指定库名库文件名称和引入库的名称去掉前缀lib 去掉后缀.so ,如 libc .so - c3. 动态库动态库.so程序在运行的时候才去链接动态库的代码多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表而不是外部函数所在目标文件的整个机器码在可执行文件开始运行以前外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中这个过程称为动态链接dynamic linking动态库可以在多个程序间共享所以动态链接使得可执行文件更小节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用节省了内存和磁盘空间。3.1 动态库生成//Makefile 1 libtest.so:test.o mystring.o 2 gcc-o $ $^-shared 3%.o:%.c 4 gcc-fPIC-c $ 5 6.PHONY:clean 7 clean: 8rm-rf*.so*.o stdc* 9 10.PHONY:output 11 output: 12 mkdir-p mylib 13 mkdir-p mylib/include 14 mkdir-p mylib/lib 15 cp-f*.h mylib/include 16 cp-f*.so mylib/libshared:表示生成共享库格式fPIC产生位置无关码(position independent code)库名规则libxxx.so3.2 动态库使用场景1头文件和库文件安装到系统路径下$ gcc main .c -lmystdio场景2头文件和库文件和我们自己的源文件在同一个路径下$ gcc main .c -L . -lmymath // 从左到右搜索-L指定的目录场景3头文件和库文件有自己的独立路径$ gcc main .c -I头文件路径-L库文件路径-lmymath$ ldd libmystdio.so // 查看库或者可执行程序的依赖linux-vdso .so .1 (0x00007fffacbbf000)libc.so.6 /lib64/libc.so.6 (0x00007f8917335000)/lib64/ld-linux-x86-64.so.2 (0x00007f8917905000)3.3 库运行搜索路径3.3.1 问题1 2 $ ldd a.out 3 linux-vdso.so.1 (0x00007fff4d396000)4 libtest.so not found 5 libc.so.6 /lib64/libc.so.6(0x00007fa2aef30000)6/lib64/ld-linux-x86-64.so.2(0x00007fa2af2fe000)可以看到libtest.so动态库找不到这是因为动态库我们不仅需要让编译器知道还需要让操作系统知道3.3.2 解决方案拷贝.so 文件到系统共享库路径下,一般指/usr/lib、/usr/local/lib、/lib64 或者开篇指明的库路径等向系统共享库路径下建立同名软连接更改环境变量LD LIBRARY PATH

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询