ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux初学记第四章--有关库同学的那些事

Linux初学记第四章--有关库同学的那些事 什么是库文件简单来说库文件就是别人写好、编译完成、封装好的一个现成的代码包这可以让我们不用从零开始写代码直接调用库里面的函数就可以实现功能。Linux系统中存储的库的位置一般在/lib和/usr/lib。在64位系统上有一些库的位置可能还在/usr/lib64下。库分为两种一种是静态库它的命令规则是libxxx.a还有一种是共享库命令规则是libxxx.so。静态库的生成与使用静态库的生成下面是需要生成静态库的.c文件 其中foo.h中是函数的声明 add.c和max.c是函数的定义在这里我们先说一下为什么要让.c文件生成静态库其实上一章已经有提到原因我们是可以将全部的.c文件一起参与编译链接生成可执行文件但如果工程文件很多的时候这样做就会非常浪费时间编译速度很慢而我们的静态库.a是编译完成后的二进制文件别人调用的时候不用再编译我们的源码只进行链接就行。并且我们打包成为一个库文件就避免文件紊乱只需要传递一个文件加头文件即可。然后我们将这些.c文件都编译为.o文件使用ar命令将编译的所有.o文件生成静态库此处我们看到的libfoo.a就是我们生成的静态库c 创建库r 将方法添加到库中v 显示其过程静态库的使用首先先写一个main.c再使用静态库libfoo.a和main.c生成可执行文件-L 指定库的存储路径 告诉gcc去哪里找库文件. 代表当前文件夹-l 指定库的名称 链接库共享库的生成与使用共享库的生成下面是需要生成共享库的.c文件 其中foo.h中是函数的声明 add.c和max.c是函数的定义其实和静态库过程一样首先我们还是要把需要生成库文件的所有.c文件编译成.o文件然后使用gcc命令将第一步编译的所有.o文件生成共享库- 程序的选项(参数开关)-shared 告诉gcc生成共享库-fPIC 告诉编译器在编译.o的时候要生成不绑定固定内存地址的机器码PIC Position-Independent Code位置无关代码 普通.o目标文件代码地址是写死的动态库要可以被不同程序加载到内存任意位置运行不可以写死地址-o 指定输出文件(output)共享库的使用以下是测试代码main.c的内容再使用共享库libfoo.so和main.c生成可执行文件并进行执行如果在库的存储路径有相同的共享库和静态库gcc默认使用共享库在这里我们会发现出错了是因为系统加载共享库时找不到对应的共享库文件因为系统一般默认去存储库的标准位置去加载(/lib或/usr/lib等)而不会在当前位置下寻找。所以将库拷贝到/usr/lib下再执行程序如果库不在标准位置下也可以通过设置环境变量LD_LIBRARY_PATH来指定加载库的路径。同时我们还解锁了一个功能可通过ldd命令查看可执行程序使用了哪些共享库静态库与共享库的区别静态库会把用到的函数实现拷贝到可执行程序中只拷贝用到的方法。共享库链接时不拷贝只做标记在运行程序时还需要链接共享库装载到内存中多个程序可以共享使用。使用共享库可以节省内存很多程序同时使用foo库内存里面只需要加载一份libfoo.so不是每个程序都要复制一份库代码升级也方便直接替换新的libfoo.so文件程序功能就更新程序体积也小。
返回列表