Linux下的动态库和静态库

本文介绍了Linux系统的库,包括静态库(.a)和动态库(.so)的创建过程。静态库在编译时合并到程序中,增大程序体积但无需运行时依赖。动态库在运行时加载,减小程序体积但需要运行时环境支持。动态库的查找路径包括标准系统目录、环境变量LD_LIBRARY_PATH及/etc/ld.so.cache。通过ldd命令可查看程序的库依赖。
摘要由CSDN通过智能技术生成

Linux和windows下的库

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的平台不同(主要是编译器、汇编器和连接器的不同),因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。

二、库的种类

库分为动态库和静态库,二者的区别是静态库在编译的时候载入到代码中,而动态库是在运行的时候载入到代码中。所以,由静态库编译的代码在运行的时候不需要静态库,但是程序的体积较大。动态库编译的代码体积较小,但是运行的时候需要动态库

库文件是如何产生的

在linux下,库文件一般放在/usr/lib和/lib下
1、静态库的后缀是.a,它的产生分两步
Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表
Step 2.ar命令将很多.o转换成.a,成为静态库
2、动态库的后缀是.so,它由gcc加特定参数编译产生。

命令查看依赖关系

ldd   /bin/lnlibc.so.6
=>/lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=>/lib/ld- linux.so.2 (0×40000000

如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。
如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下:
.1、编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
2、运行ldconfig,该命令会重建/etc/ld.so.cache文件
或者将当前的库路径添加到环境变量中

export LD_LIBRARY_PATH=${PWD}

例子

hello.h
#ifndef HELLO_H
#define HELLO_H
 
void hello(const char *name);
 
#endif
hello.c
#include <stdio.h>
 
void hello(const char *name){
 
    printf("Hello%s!\n",name);
}

main.c
#include "hello.h"
int main()
{
    hello("everyone");
    return 0;
}

# gcc -c hello.c
# gcc –c main.c
# gcc hello.o main.o –o hello

解析:使用” -lmyhello” 标记来告诉GCC驱动程序在连接阶段引用共享函数库libmyhello.so。” -L.”标记告诉GCC函数库可能位于当前目录。否则GNU连接器会查找标准系统函数目录:它会先后搜索

1.elf文件的 DT_RPATH段

2.环境变量LD_LIBRARY_PATH

3./etc/ld.so.cache文件列表

  1. /lib/,/usr/lib目录找到库文件后将其载入内存,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值