Linux——库相关面试题

发布于:2024-04-09 ⋅ 阅读:(137) ⋅ 点赞:(0)

面试题1:
问题:什么是库文件,说一下静态库与共享库的区别,并给出生成静态库与共享库的示例命令?
解答:
(1)库是一组预先编译好的方法的集合;
(2)共享库如果10个应用程序共享,那么磁盘上只有一份共享的库文件,而且运行加载时在内存中只加载了标记了的这一份库文件;而静态库,就是这10个应用程序都包含了这个库文件,那么10份的库文件都放在磁盘上了(占用磁盘空间),而且运行加载的时候占用内存空间(10份库文件都要加载);
(3)生成静态库的方法:

1)先将需要生成库文件的所有.c文件编译成.o文件;

2)创建静态库(使用ar命令):ar crv libxxx.a xxxx.o xxx.o  

 3)静态库的使用:gcc -o main main.c -L. -lxxx    (其中:-L:指定库的存储位置  -l:指定库的名称(不需要前面的lib和扩展名.a) )

生成共享库的方法:

1)将所有的.c文件编译成目标文件.o  

2)将所有目标文件打包生成共享库:gcc -shared -fPIC -o libxxx.so xxx.o xxx.o    

3)共享库的使用:  gcc -o main main.c -L路径 -l库名 注意:共享库必须要放到标准路径下:sudo mv libxxx.so /usr/lib


面试题2:静态链接和动态链接
1、静态链接: 函数和数据被编译进一个二进制文件。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件。

空间浪费:因为每个可执行程序中对所有需要的目标文件都要有一份副本,所以如果多个程序对同一个目标文件都有依赖,会出现同一个目标文件都在内存存在多个副本;

更新困难:每当库函数的代码修改了,这个时候就需要重新进行编译链接形成可执行程序。 运行速度快:但是静态链接的优点就是,在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。

2、动态链接:
动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。

共享库:就是即使需要每个程序都依赖同一个库,但是该库不会像静态链接那样在内存中存在多份副本,而是这多个程序在执行时共享同一份副本; 

更新方便:更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。当程序下一次运行时,新版本的目标文件会被自动加载到内存并且链接起来,程序就完成了升级的目标。 性能损耗:因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失。


网站公告

今日签到

点亮在社区的每一天
去签到