cn域名建网站,网络营销型网站建设的内容,wordpress 没有足够权限,wordpress软件下载站主题Linux动静态库
1.动静态库介绍
在程序翻译的链接阶段#xff0c;其实就是把一堆.o文件链接在一起形成.exe文件。如果一个程序中需要链接很多个.o文件#xff0c;那么这些.o文件就需要被打包才方便管理#xff0c;**库文件本质就是把.o文件打包。**库文件是一种提高开发效率…Linux动静态库
1.动静态库介绍
在程序翻译的链接阶段其实就是把一堆.o文件链接在一起形成.exe文件。如果一个程序中需要链接很多个.o文件那么这些.o文件就需要被打包才方便管理**库文件本质就是把.o文件打包。**库文件是一种提高开发效率的手段。
库有动态库和静态库之分不同的操作系统的动静态库后缀也不同
动态库静态库Linux.so.aWindows.dll.lib
对于静态库使用静态库形成可执行程序后静态库被加载到了可执行程序的代码里不需要让系统知道静态库在哪里但对于动态库由于动态库不加载到可执行程序里而是动态加载到内存中所以使用动态库要告诉系统动态库在哪因为是系统来加载动态库。
动态库在编译时代码不会被复制到可执行文件中而是在运行时由操作系统动态加载到内存中。而静态库在编译时代码会被完整地复制并链接到可执行文件中。使用动态库的可执行程序共用同一个库而使用静态库的可执行程序中都单独有静态库的拷贝。
链接
我们的程序需要与某些库结合才能执行与库结合的过程就是链接。每个语言都要有自己的标准库在安装开发环境的时候就需要安装语言的标准库和头文件。
2. 动静态库的优缺点
2.1 动态库
优点 1.更加节省内存并减少页面交换。 2.库文件与程序文件独立只要输出接口不变更换库文件不会对程序文件造成任何影响因而极大地提高了可维护性和可扩展性。 3.不同编程语言编写的程序只要按照函数调用约定就可以调用同一个库函数。 4.适用于大规模的软件开发使开发过程独立、耦合度小便于不同开发者和开发组织之间进行开发和测试。 缺点 1.运行时依赖否则找不到库文件就会运行失败。 2.运行加载速度相较静态库慢一些。 3.需要对库版本之间的兼容性做出更多处理。 2.2 静态库
静态库
优点 1.运行加载速度块。 2.使用静态库的可执行程序一旦形成就与库无关。 缺点 1.有多少个程序依赖静态库静态库在代码中就有多少份拷贝造成资源浪费。 2.修改静态库代码后需要重新形成所有依赖这个库的可执行程序造成时间浪费。 2. gcc链接第三方库的方法
gcc/g需要知道库的路径才能找到库如果不把第三方库安装到系统的库目录里gcc/g就需要有头文件和库的所在目录路径才能找到找到第三方库其中头文件只需要传它们所在的目录即可但库文件除了给出目录的路径还需要给出库的具体名字且要删去lib和.a只保留中间的部分。
gcc链接第三方库的选项 gcc [file] -I [头文件路径] -L [库文件路径] -l [库文件名] -I表示指定用户自定义头文件路径 -L表示用户自定义库文件路径 -l表示执行确定的第三方库名称 #inlcude中的表示在系统的库目录中查找。实际上代码文件中的#inlcude中就已经给出了头文件的具体名字所以不用在gcc的时候加上头文件的名字。如果将替换成且里面的内容不是头文件的名字而是头文件的路径加名字那么gcc的时候甚至可以不写头文件的路径。
链接静态库
gcc默认链接动态库如果gcc没有-static选项且只提供.a那么就会静态链接.a库其他库正常动态链接如果有-staitc选项它表示链接的所有库都必须提供对应的静态库否则报错。
3. 让系统找到第三方库的方法
3.1 把库安装到系统
所有的系统动态库都在lib64目录下存储解决系统找不到动态库的一个办法就是把第三方库拷贝到该目录下且系统与该目录的动态库是松耦合关系只要动态库在目录里就能直接被找到。
3.2 软链接法
一般不推荐把第三方库直接安装到lib64目录下但是可以在lib64目录里建立一个第三方库的软链接这种方法在实践中也常用到。
3.3 设置环境变量法
可以通过LD_LIBRARY_PATH设置临时环境变量让系统在找寻库的时候在特定的路径下查找添加环境变量的方式为 LD_LIBRARY_PATH$LD_LIBRARY_PATH:[库路径] 该环境变量在每次系统登陆时都会刷新不能永久保存。
如果想永久保存设置的环境变量可以修改.barshrc环境变量配置文件让环境变量永久生效。
3.4 设置conf
最推荐的方式是设置新增动态库搜索的配置文件
先以管理员权限进入这个目录 /etc/ld.so.conf.d 在该路径下添加一个文件 touch [name].conf 用vim打开刚刚新建的.conf文件在配置文件里将动态库的路径拷贝进去然后使用ldconfig命令使配置文件生效。
4.动态库的底层
当进程被加载到内存时它对应的动态库并不会随之加载进内存而是当进程要使用动态库里的内容时页表发现动态库不存在发生缺页中断于是OS到磁盘中找到动态库将它加载到内存中。在进程内部动态库的代码被放入在地址空间中的一块空间中(静态库也在这)而在物理地址中进程的代码和动态库独立静态库直接加载到进程的代码中使得动态库像一个独立的进程存在于内存中。当其他进程要使用该动态库时页表发现动态库已经在内存中了于是就直接映射不允许再次将动态库加载到内存中即多个进程共享同一个动态库。
当进程使用动态库中的某个函数时库里的函数本身就有地址而地址空间中本身也有一套地址。所以进程不能直接使用库中的地址它本质是将库起始位置的地址称为偏移量加上库中函数的地址最终组成进程访问库中函数的地址。 相关命令
查看系统库文件的命令 ls /lib64 形成.o文件的命令 gcc -c [file] 形成静态.o gcc -fPIC -c [file] 形成动态.o -fPIC表示与产生位置无关码position independent code 打包库的命令 静态库 ar -rc [file].a *.o rc表示(replace and create)存在就替换不存在就创建 动态库 gcc可以直接用来形成动态库因为实际使用中动态库的使用频率比静态库大 gcc -shared *.o -o [lib].so -shared表示形成共享库格式其实就是告诉gcc不要形成可执行程序
gcc链接系统库的命令
gcc/g不认识第三方库所以在编译的时候要加-l选项但要注意库文件一般以libxx.a命名但-l后面的选项要删去lib和.a只保留中间的部分 gcc [file] -l [lib] 查看可执行程序链接的库的命令 ldd [可执行程序]