中国万网怎么自己做网站,网站前置审批文件,福州短视频seo费用,房源信息网库从本质上来说是一种可执行代码的二进制格式#xff0c;可以被载入内存中执行。库分静态库和动态库两种。 静态库和动态库的区别1. 静态函数库这类库的名字一般是libxxx.a#xff1b;利用静态函数库编译成的文件比较大#xff0c;因为整个 函数库的所有数据都会被整合进目标…库从本质上来说是一种可执行代码的二进制格式可以被载入内存中执行。库分静态库和动态库两种。 静态库和动态库的区别1. 静态函数库 这类库的名字一般是libxxx.a利用静态函数库编译成的文件比较大因为整个 函数库的所有数据都会被整合进目标代码中他的优点就显而易见了即编译后的执行程序不需要外部的函数库支持因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点因为如果静态函数库改变了那么你的程序必须重新编译。2. 动态函数库 这类库的名字一般是libxxx.so;相对于静态函数库动态函数库在编译的时候 并没有被编译进目标代码中你的程序执行到相关函数时才调用该函数库里的相应函数因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序而是程序运行时动态的申请并调用所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序所以动态函数库的升级比较方便。 linux系统有几个重要的目录存放相应的函数库如/lib /usr/lib。静态库的使用静态库的操作工具gcc和ar 命令。 编写及使用静态库 (1)设计库源码 pr1.c 和 pr2.c [rootbillstone make_lib]# cat pr1.c void print1() { printf(This is the first lib src!n); } [rootbillstone make_lib]# cat pr2.c void print2() { printf(This is the second src lib!n); } (2) 编译.c 文件 [billbillstone make_lib]$ cc -O -c pr1.c pr2.c [billbillstone make_lib]$ ls -l pr*.o -rw-rw-r-- 1 bill bill 804 4 月 15 11:11 pr1.o -rw-rw-r-- 1 bill bill 804 4 月 15 11:11 pr2.o (3) 链接静态库 为了在编译程序中正确找到库文件,静态库必须按照 lib[name].a 的规则命名,如下例中[name]pr. [billbillstone make_lib]$ ar -rsv libpr.a pr1.o pr2.o a - pr1.o a - pr2.o [billbillstone make_lib]$ ls -l *.a -rw-rw-r-- 1 bill bill 1822 4 月 15 11:12 libpr.a [billbillstone make_lib]$ ar -t libpr.a pr1.o pr2.o (4) 调用库函数代码 main.c [billbillstone make_lib]$ cat main.c int main() { print1(); print2(); return 0; } (5) 编译链接选项 -L 及-l 参数放在后面.其中,-L 加载库文件路径,-l 指明库文件名字. [billbillstone make_lib]$ gcc -o main main.c -L./ -lpr [billbillstone make_lib]$ ls -l main* -rwxrwxr-x 1 bill bill 11805 4 月 15 11:17 main -rw-rw-r-- 1 bill bill 50 4 月 15 11:15 main.c (6)执行目标程序 [billbillstone make_lib]$ ./main This is the first lib src! This is the second src lib! [billbillstone make_lib]$ 动态库的使用编写动态库 (1)设计库代码 [billbillstone make_lib]$ cat pr1.c int p 2; void print(){ printf(This is the first dll src!n); } [billbillstone make_lib]$ (2)生成动态库 [billbillstone make_lib]$ gcc -O -fpic -shared -o dl.so pr1.c [billbillstone make_lib]$ ls -l *.so -rwxrwxr-x 1 bill bill 6592 4 月 15 15:19 dl.so [billbillstone make_lib]$ 动态库的隐式调用 在编译调用库函数代码时指明动态库的位置及名字, 看下面实例 [billbillstone make_lib]$ cat main.c int main() { print(); return 0; } [billbillstone make_lib]$ gcc -o tdl main.c ./dl.so [billbillstone make_lib]$ ./tdl This is the first dll src! [billbillstone make_lib]$ 当动态库的位置活名字发生改变时, 程序将无法正常运行; 而动态库取代静态库的好处之一则是通过更新动态库而随时升级库的内容. 动态库的显式调用 显式调用动态库需要四个函数的支持, 函数 dlopen 打开动态库, 函数 dlsym 获取动态库中对象基址, 函数 dlerror 获取显式动态库操作中的错误信息, 函数 doclose 关闭动态库.[billbillstone make_lib]$ cat main.c #include dlfcn.h int main() { void *pHandle; void (*pFunc)(); // 指向函数的指针 int *p; pHandle dlopen(./d1.so, RTLD_NOW); // 打开动态库 if(!pHandle){ printf(Cant find d1.so n); exit(1); } pFunc (void (*)())dlsym(pHandle, print); // 获取库函数 print 的地址 if(pFunc) pFunc(); else printf(Cant find function printn); p (int *)dlsym(pHandle, p); // 获取库变量 p 的地址 if(p) printf(p %dn, *p); else printf(Cant find int pn); dlclose(pHandle); // 关闭动态库 return 0; } [billbillstone make_lib]$ gcc -o tds main.c –ld1 –L.此时还不能立即./tds因为在动态函数库使用时会查找/usr/lib、/lib目录下的动态函数库而此时我们生成的库不在里边。 这个时候有好几种方法可以让他成功运行 最直接最简单的方法就是把libstr_out.so拉到/usr/lib或/lib中去。 还有一种方法 export LD_LIBRARY_PATH$(pwd) 另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录然后/sbin/ldconfig。 /etc/ld.so.conf是非常重要的一个目录里面存放的是链接器和加载器搜索共享库时要检查的目录默认是从/usr/lib /lib中读取的所以想要顺利运行我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig 。另外还有个文件需要了解/etc/ld.so.cache,里面保存了常用的动态函数库且会先把他们加载到内存中因为内存的访问速度远远大于硬盘的访问速度这样可以提高软件加载动态函数库的速度了。库依赖的查看使用ldd命令来查看执行文件依赖于哪些库。该命令用于判断某个可执行的 binary 档案含有什么动态函式库。[roottest root]# ldd [-vdr] [filename]参数说明--version 打印ldd的版本号-v --verbose 打印所有信息例如包括符号的版本信息-d --data-relocs 执行符号重部署并报告缺少的目标对象只对ELF格式适用-r --function-relocs 对目标对象和函数执行重新部署并报告缺少的目标对象和函数只对ELF格式适用--help 用法信息。如果命令行中给定的库名字包含/这个程序的libc5版本将使用它作为库名字否则它将在标准位置搜索库。运行一个当前目录下的共享库加前缀./。Linux-C语言学习交流群【721709245】在学的进群一起交流资料自己群文件下载相关资料Linux库的实现与应用静态库动态库