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文件列表
- /lib/,/usr/lib目录找到库文件后将其载入内存,