3、库文件

article/2025/8/17 21:12:03

1、什么式库文件:

库文件是预先编译好的方法的集合。(相当于一大堆的可执行文件) 存放头文件的标准目录:/usr/include

存放库文件的标准目录:/usr/lib

比如:

printf函数的实现在库文件中 libcs.so

声明在/usr/include/stdio.h

库分为:

静态库 libxx.a

共享库 libxx.so

2、创建静态库

stu@stu-virtual-machine:~/Test$ cd 静态库举例
stu@stu-virtual-machine:~/Test/静态库举例$ vi add.c
stu@stu-virtual-machine:~/Test/静态库举例$ vi max.c
stu@stu-virtual-machine:~/Test/静态库举例$ vi foo.h
stu@stu-virtual-machine:~/Test/静态库举例$ ls
add.c  foo.h  max.c
stu@stu-virtual-machine:~/Test/静态库举例$ gcc -c add.c max.c
stu@stu-virtual-machine:~/Test/静态库举例$ ls
add.c  add.o  foo.h  max.c  max.o
stu@stu-virtual-machine:~/Test/静态库举例$ ar crv libfoo.a add.o max.o
a - add.o
a - max.o
stu@stu-virtual-machine:~/Test/静态库举例$ rm add.o max.o
stu@stu-virtual-machine:~/Test/静态库举例$ ls
add.c  foo.h  libfoo.a  max.c

ar 将几个不同的文件集合放在另一个文件中

c创建

r添加

v展现

ex:ar crv libfoo.a add.o max.o创建一个静态库,将add.o max.o添加到libfoo.a静态库中,lib 和 .a分别为前后缀

3、使用静态库

stu@stu-virtual-machine:~/Test/静态库举例$ ls
add.c  foo.h  libfoo.a  max.c
stu@stu-virtual-machine:~/Test/静态库举例$ vi main.c
stu@stu-virtual-machine:~/Test/静态库举例$ gcc -o main main.c -L. -lfoo
stu@stu-virtual-machine:~/Test/静态库举例$ ./main
a+b=5
stu@stu-virtual-machine:~/Test/静态库举例$ 

在main.c程序中,我调用了add函数,并且引用了foo.h,但是编译链接的时候并没有对add.c进行编译链接,但是依然得出了结果,原因是我将编译好的add.c和max.c编译为add.o和max.o放入了libfoo.a静态库中,因此,只需要在编译使用静态库中已经编译好的函数即可。

gcc -o main main.c -L. -lfoo

-L. 指定当前路径

-lfoo 告诉编译器使用名为libfoo.a的静态库,或者名为libfoo.so的共享库,如果存在的话。

4、将静态库和头文件移动到标准的存储位置

stu@stu-virtual-machine:~/Test/静态库举例$ sudo su
[sudo] stu 的密码: 
root@stu-virtual-machine:/home/stu/Test/静态库举例# mv foo.h /usr/include
root@stu-virtual-machine:/home/stu/Test/静态库举例# ls
add.c  libfoo.a  main  main.c  max.c
root@stu-virtual-machine:/home/stu/Test/静态库举例# mv libfoo.a /usr/lib
root@stu-virtual-machine:/home/stu/Test/静态库举例# ls
add.c  main  main.c  max.c
stu@stu-virtual-machine:~/Test/静态库举例$ gcc -o main main.c -lfoo
stu@stu-virtual-machine:~/Test/静态库举例$ ls
add.c  main  main.c  max.c
stu@stu-virtual-machine:~/Test/静态库举例$ ./main
a+b=5
stu@stu-virtual-machine:~/Test/静态库举例$ 

**这样的话是使用静态库的时候,就不用指定位置了。**除了c标准库,其他的都得指定路径。

gcc -o main main.c -lfoo

此时,可以将#include"foo.h"改为#include<stdio.h>了

5、创建共享库(用的非常普遍的时候,就创建共享库,文件中引用,但不会包含共享库的代码,运行的时候才会用)

stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ gcc -shared -fPIC -o libfoo.so add.o max.o
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ls
add.c  add.o  libfoo.so  main.c  max.c  max.o
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ gcc -o main main.c
main.c:2:9: fatal error: foo.h: 没有那个文件或目录2 | #include"foo.h"|         ^~~~~~~
compilation terminated.
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ vi foo.h
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ gcc -o main main.c
/usr/bin/ld: /tmp/ccsLnS20.o: in function `main':
main.c:(.text+0x25): undefined reference to `add'
collect2: error: ld returned 1 exit status
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ vi main.c
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ gcc -o main main.c -L -lfoo
/usr/bin/ld: /tmp/cconHCyu.o: in function `main':
main.c:(.text+0x25): undefined reference to `add'
collect2: error: ld returned 1 exit status
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ gcc -o main main.c -L. -lfoo
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ./main
./main: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ sudo su
[sudo] stu 的密码: 
root@stu-virtual-machine:/home/stu/Test/共享库举例/共享库举例# mv libfoo.so /usr/lib
root@stu-virtual-machine:/home/stu/Test/共享库举例/共享库举例# exit
exit
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ./main
a+b=5

创建共享库:

stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ gcc -shared -fPIC -o libfoo.so add.o max.o

要用共享库必须将共享库放在标准库目录,编译器才可以找到

stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ gcc -o main main.c -L. -lfoo
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ./main
./main: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ sudo su
[sudo] stu 的密码: 
root@stu-virtual-machine:/home/stu/Test/共享库举例/共享库举例# mv libfoo.so /usr/lib
root@stu-virtual-machine:/home/stu/Test/共享库举例/共享库举例# exit
exit
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ./main
a+b=5

6、通过ldd命令能查出来程序用到了那些共享库

stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ldd mainlinux-vdso.so.1 (0x00007ffeeab03000)libfoo.so => /lib/libfoo.so (0x00007fa4a432f000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa4a413d000)/lib64/ld-linux-x86-64.so.2 (0x00007fa4a434c000)

如上第一个和最后一个Linux必须引用的库第二个和第三个自己创建的共享库还有c的标准库,usr/lib和/lib实际上是同一个

7、共享库如果不加在标准库目录会有什么后果

stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ sudo su
root@stu-virtual-machine:/home/stu/Test/共享库举例/共享库举例# rm /lib/libfoo.so
root@stu-virtual-machine:/home/stu/Test/共享库举例/共享库举例# exit
exit
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ldd mainlinux-vdso.so.1 (0x00007ffc8b95c000)libfoo.so => not foundlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4a0690a000)/lib64/ld-linux-x86-64.so.2 (0x00007f4a06b14000)
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ./main
./main: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory

如上,在查看main用了哪些共享库的时候,会发现libfoo.so 没有发现

./main也不能运行,因为共享库要存放在标准库

7、也可以用LD_LIBRARY_PATH来指定加载库的路径。(只在此终端中有效)

stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ gcc -shared -fPIC -o libfoo.so max.o add.o
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ls
add.c  add.o  foo.h  libfoo.so  main  main.c  max.c  max.o
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ LD_LIBRARY_PATH=.
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ echo $LD_LIBRARY_PATH
.
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ./main
./main: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ export LD_LIBRARY_PATH
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ./main
stu@stu-virtual-machine:~/Test/共享库举例/共享库举例$ ./main
a+b=5

8、静态库与共享库的区别

静态库是将用到的程序包含到库中了,运行时直接将静态库连接到main中就行,而共享库就是将要用到的程序放到共享库中,然后将共享库库放在标准库中,运行时标记要用哪个共享库用将从标准库中寻找共享库,然后将共享库中的程序包含到main中,然后进行运行。

静态库包含在可执行程序中成为程序得以部分,但是共享库不包含在main中。

要是某端程序要多此被引用,可直接将其放入共享库。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E2uYDQp1-1634396418141)(C:\Users\刘锦\Desktop\QQ图片20211016225907.png)]

就是将要用到的程序放到共享库中**,然后将共享库库放在标准库中,运行时标记要用哪个共享库用将从标准库中寻找共享库,然后将共享库中的程序包含到main中,然后进行运行。

静态库包含在可执行程序中成为程序得以部分,但是共享库不包含在main中。

要是某端程序要多此被引用,可直接将其放入共享库。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/mymUpiVa.shtml

相关文章

库文件:静态库与动态库的生成和使用

0.引言 当进行C语言的编写时&#xff0c;想要查看标准库的某个函数是怎样实现的&#xff0c;比如 stdio.h 里的 printf 函数&#xff0c;跳转后只能看见函数声明&#xff0c;而无法跳转到函数的定义处&#xff0c;为什么无法查看函数的定义&#xff0c;这就涉及到库文件使用。…

【C++】静态库和动态库文件的生成和使用

前言 文章目录 前言库文件静态库的生成hello.hhello.cmain.c 动态库的生成GCC命令相同时&#xff0c;会先执行.a文件&#xff0c;还是会先执行.so文件&#xff1f;静态库与动态库的区别使用静态库的使用动态库的使用 总结 本文主要讲解了静态库和动态库的生成&#xff0c;以及.…

标准库文件

工艺库有db文件和lib文件&#xff0c;db是打不开的&#xff0c;lib是打得开的。 以反向器为例&#xff0c;时序弧上的延迟由两个因素影响&#xff0c;负载越大&#xff0c;延迟越大&#xff1b;输入转换时间越大&#xff0c;延迟越大。 随着工艺更加先进&#xff0c;线性模…

linux的库文件

文章参考链接&#xff1a;https://www.cnblogs.com/tankblog/p/6780146.html 一、什么是库文件&#xff1f; 本质上来说&#xff0c;库文件就是可执行代码的二进制形式&#xff0c;可以被操作系统载入内存中执行 Linux操作系统支持的函数库分为静态库和动态库&#xff0c;动态…

linux库文件

windows静态库文件扩展名.lib 动态库文件扩展名.dll linux 静态库.a 动态库.so 都是将函数封装在一起编译后供自己或他人调用&#xff0c;好处是编译后的库文件看不带源代码&#xff0c;可以保密 linux库文件一般存在 /lib 和/usr/lib 64位下也有可能存在 /usr/lib64 下…

Linux系统上库文件的生成与使用(静态库和动态库)

目录 1、什么是库文件&#xff1f; 2、静态库的生成与使用 2.1、生成 .o 文件 2.2、创建静态库 2.3、使用静态库 3、动态&#xff08;共享&#xff09;库的生成与使用 3.1、生成 .o 文件 3.2、生成动态库文件 3.3、使用动态库 4、静态库与动态库的区别 1、什么是库文…

库文件简述

什么是库文件&#xff1f; 库就是一组预先编译好的方法的集合。在linux系统中&#xff0c;库文件一般被存储在/lib和/usr/lib中&#xff0c;库的头文件一般会被存储在/usr/include下。 库文件可以分为静态库和共享库两种。 静态库的命名规则为libxxx.a&#xff0c;共享库的命名…

六、库文件

今天我们来了解一下库文件&#xff0c;主要有以下几个内容&#xff1a; 文章目录 一、库文件概念二、静态库&#xff08;一&#xff09;生成&&使用&#xff08;二&#xff09; 示例&#xff08;三&#xff09; 特点 三、动态库&#xff08;一&#xff09;生成&&am…

库文件

目录 库文件 静态库 动态库&#xff08;共享库&#xff09; 静态库和共享库的区别 库文件 库文件是预先编译好的方法的集合。 比如&#xff1a;我们提前写好一些数据公式的实现&#xff0c;将其打包成库文件&#xff0c;以后使用只需要库文件就可以&#xff0c;而不需要重…

EDID 修改

EDID 128字节(不包括扩展)&#xff0c;如果手动修改的话比较麻烦(最后一个字节校验和必须自己计算–128字节和为0)&#xff0c;借助第三方工具比较好。 比如&#xff1a; SoftMCCS Phoenix EDID Designer EDIDManager EDIDViewer等。 如果只要修改制造商代号&#xff0c;…

EDID参数介绍

1、显示器的第24个字节是设置显示器的电源管理标准的。 各个位的作用如下&#xff0c;注意到标号为1的位是关于主画面。 3、Gamma源于CRT的响应曲线&#xff0c;即反映显像管的图像亮度与输入电子枪的信号电压的非线性关系的一个参数。对于CRT显示器而言&#xff0c;显像管电子…

EDID文件格式转换工具介绍

EDID文件格式转换工具介绍 1 EDID文件 简单来说&#xff0c;EDID文件主要内容就是128个字节数据&#xff08;V1.3版本&#xff09;或是256个字节数据&#xff08;V1.4版本&#xff09;。   但是不同的EDID的编辑工具支持的文件格式又不同&#xff0c;例如Phoenix EDID Desig…

EDID含义浅析

SoftMCCSEDID 开头&#xff08;HEADER&#xff09; 开头八个字节为EDID的开始标志&#xff0c;简称头&#xff0c;固定为&#xff1a;制造商和产品ID 这十个字节表示产品&#xff08;MONITOR&#xff09;ID和制造商信息。详细如下&#xff1a;EDID版…

display:dp:edid/e-edid/displayid

名词 EDID Extended Display Identification Data (Legacy VESA structure, superseded by the DisplayID structure).E-EDID Enhanced Extended Display Identification Data (Legacy VESA structure, superseded by the DisplayID structure).DisplayID Displa…

如何获取显示器的EDID信息

来源:http://wenku.baidu.com/view/8f82728471fe910ef12df8f4.html Q1: 为什么要写这篇文章&#xff1f; A1&#xff1a;在最近的工作中遇到了不少问题&#xff0c;其中很多都是和EDID相关的。可以说&#xff0c;作为一家以“显示”为生的企业&#xff0c;我们时时刻刻在与EDID…

HDMI之EDID使用说明

Q1: 为什么要写这篇文章&#xff1f; A1&#xff1a;在最近的工作中遇到了不少问题&#xff0c;其中很多都是和EDID相关的。可以说&#xff0c;作为一家以“显示”为生的企业&#xff0c;我们时时刻刻在与EDID打交道。EDID这东西很简单&#xff0c;但是如果不了解其基本原理和…

EDID基础

EDID EDID&#xff1a;Extended Display Identification Data (拓展显示标识数据)EDID是由VESA创造出来的&#xff0c;用于使显示器支持即插即用。 一般EDID存在于显示器的PROM或EEPROM内&#xff0c;一般如要读取EDID都是通过DDC EDID的作用主要是为了能让PC或其他的图像输…

EDID 解读

现在的显示设备比如显示器&#xff0c;电视等都HDMI接口&#xff0c;那通常每个HDMI接口都保留有一份EDID数据&#xff0c;这个数据可以存在程序里面由系统启动过程中来初始化&#xff0c;更常见的做法是每个HDMI口会有一个EEPROM来保存这份数据&#xff0c;这个EEPROM也只是有…

HDMI设计2----EDID and E-EDID

1,EDID是什么&#xff1f;有什么用&#xff1f; 图1 应用场景 如图1所示的应用场景&#xff0c;PC将视频信号发送 到我们的设备上&#xff0c;经过一系列的传输和切换&#xff0c;设备将视频信号发送到显示器或者投影机上&#xff0c;也就是说&#xff0c;我们的设备位于PC和显…

EDID 解析

1、显示器的第24个字节是设置显示器的电源管理标准的。 各个位的作用如下&#xff0c;注意到标号为1的位是关于主画面。 3、Gamma源于CRT的响应曲线&#xff0c;即反映显像管的图像亮度与输入电子枪的信号电压的非线性关系的一个参数。对于CRT显示器而言&#xff0c;显像管电子…