网站正在建设中9797,沈阳建设工程信息网 姚军,广州比较好的网站建设,怎么用div布局做网站一、静态库#xff08;格式#xff1a;libxxx.a#xff09;
1. 原理
在运行之前就已经把函数的实现代码拷进 main.c 文件里了#xff0c;因此静态库的权限是没有可执行权限的#xff0c;因为根本不会执行到静态库里的内容。静态库的创建原理本质上就是把所有的函数源文件…一、静态库格式libxxx.a
1. 原理
在运行之前就已经把函数的实现代码拷进 main.c 文件里了因此静态库的权限是没有可执行权限的因为根本不会执行到静态库里的内容。静态库的创建原理本质上就是把所有的函数源文件编译成 *.o 文件后再把所有的 *.o 文件合成一个库而这个库就是静态库。
2. 创建
在 makefile 中可这样创建
liblibmylib.a$(lib):add.oar -rc $ $^
add.o:add.cgcc -c $^.PHONY:clean
clean:rm -rf *.o *.a a.out mylib.PHONY:output
output:mkdir -p mylib/includemkdir -p mylib/libsmv *.h mylib/includemv *.a mylib/libs
3. 使用
a. 头文件 库的区别
头文件是以 .h 结尾的文件库是以 .a 结尾的文件
b. 命令gcc -I -L l...
// 假如要对 /lib/libmylib.a 进行静态连接
gcc -I 头文件的路径 -L 静态库的路径 -lmylib 补充因为 libmylib 只有静态库的版本因此 gcc 编译时只能编成静态库。换句话说如果同时有 libmylib.a 和 libmylib.so 两个版本的库gcc 编译时会选择 libmylib.so 编成动态库。 二、动态库共享库格式libxxx.so
1. 原理
在程序运行时会把代码函数的实现加载进内存中然后再调整页表的映射关系使其虚拟地址在进程地址空间的共享区中。然后调用函数时程序会直接跳转到共享区执行函数。
2. 创建
在 makefile 中可这样创建
liblibmylib.so$(lib):add.ogcc -shared -o $ $^
add.o:add.cgcc -fPIC -c $^.PHONY:clean
clean:rm -rf *.o *.so a.out mylib.PHONY:output
output:mkdir -p mylib/includemkdir -p mylib/libsmv *.h mylib/includemv *.so mylib/libs
3. 使用
// 假如要对 /lib/libmylib.so 进行静态连接
gcc -I 头文件的路径 -L 动态库的路径 -lmylib
4. 优势
因为动态链接的库可以实现多进程共享因此可以减少内存的使用。
5. 动态库如何从磁盘加载到内存
1动态库如何载入内存
当程序运行到需要调用动态库的代码时如果动态库此时并没有载入内存那么操作系统就会把动态库载入内存然后修改页表的映射关系而对于进程地址空间动态库的代码也会载入进程地址空间的共享区然后进程就可以访问动态库的代码啦
如果动态库已经在内存里了那就直接向当前进程的页表添加映射关系然后动态库的代码载入该进程的共享区然后进程就可以访问动态库的代码啦
2进程如何访问动态库的代码通过相对地址
由于共享区可能有多个动态库因此动态库的起始地址是不确定的因此如果一个动态库的代码载入共享区那么这些代码一定不会用绝对地址来编址。取而代之的是动态库的代码会采用相对地址编址然后再加上载入共享区后获得的绝对起始地址设起始地址的值为 start那么进程可以通过 start 相对地址 的方式访问该动态库的代码。
6. 解决动态库加载问题
把库放到程序搜索库的默认文件里如 /lib64把库与程序搜索库的默认文件建立软连接如 mylib - /lib64把自己的库路径添加到环境变量 LD_LIBRARY_PATH 中在 /etc/ld.so.conf.d 中建立自己的配置文件然后重新 ldconfig 即可永久有效