迅雷网站做爰视频,视频网站建设,东莞服务公司网站建设,wordpress后台中文设置1. 库 是代码的二进制的封装形式 在其他的源代码或库中#xff0c;可以直接调用库的#xff0c;但是又看不到它 没有公开源代码 库的这种实现方法有利于模块化 而且只要接口合理 不影响库的使用的 sum.c sum.h int sum(int a,int b) { return ab; } xxx.c 需要使用…1. 库 是代码的二进制的封装形式 在其他的源代码或库中可以直接调用库的但是又看不到它 没有公开源代码 库的这种实现方法有利于模块化 而且只要接口合理 不影响库的使用的 sum.c sum.h int sum(int a,int b) { return ab; } xxx.c 需要使用sum 原来的做法 就是直接把源代码拷贝 (1) 直接给源代码不利于知识产权的保护 想给你用但是又让你知道到底如何去实现的 (2) 加入有一天sum文件的实现更新换代了使用sum的代码需要重新编译打包下载 现在: 使用库 sum.c sum.h int sum(int a,int b) { return ab; } 编译生成libxxxx.so(库的二进制) xxx.c 想要去使用sum,直接链接到libxxx.so a.out 运行a.out 加载libxxxx.so就可以了 库 动态库 和 静态库 2. 动态库 动态库的使用步骤 1. 制作动态库 a.编辑源代码(库的代码) 如 LinkedList.c 功能函数的实现 LinkedList.h 接口文件 库的源代码 不能包含 main函数 b.生成动态库 gcc(arm-linux-gcc) -shared -fpic -o libLinkedList.so LinkedList.c(可以根据自己需要多加其他的.c) 把LinkedList.c编译成动态库生成的动态库的名字 libLinkedList.so -shared 生成动态库 -fpic 与位置无关 -o 指定生成动态库的名字 动态库的名字 一般都只以lib开头以.so结尾的文件 lib[0-9a-zA-Z]\.so 2. 使用动态库 a.把头文件和库拷给需要的人 xxx.c ------LinkedList.h ------libLinkedList.so gcc xxx.c -I 目录1 -I 目录2 ...... -L 目录名字 -l LinkedList -o xxx -Ii的大写 接一个目录名,指定的头文件的搜索路径可以接多个-I inlcude -L 接一个目录名,指定后面的那个库的搜索路径 -l 库名把lib .so去掉所剩下的就是库名 eg: gcc xxx.c -I ../ -L ../ -l LinkedList -o xxx 执行上面的命令会生成可执行文件xxx 并且这个可执行文件xxx 会使用到库libLinkedList.so 但是在生成xxx的时候并没有把动态库中内容拷贝到xxx中只是标记 xxx的运行需要库的支持的 ./link: error while loading shared libraries: libLinkedList.so: cannot open shared object file: No such file or directory b. 最终运行使用库的那个可执行文件前确保依赖库在 运行的系统中只打需要在哪一个目录下搜索依赖库 环境变量 LD_LIBRARY_PATH LD:loading 加载依赖库的路径 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:你的依赖库的路径 绝对路径 or 把依赖库直接丢到LD_LIBRARY_PATH指定的路径中去 /usr/lib/ 3. 静态库 1.制作静态库 1编辑源代码 2把所有的源代码编译成.o gcc(arm-linux-gnueabi-gcc) -c xxx.c -o xxx.o 3用ar命令把所有的.o文件打包生成静态库 (arm-linux-gnueabi-)ar -rcs libxxxx.a a.o b.o -r 更新 -c 创建 -s 创建索引 把a.o b.o打包生成静态库 libxxxx.a 2.使用 1把静态库和头文件拷贝给别人 gcc(arm-linux-gnueabi-gcc) main.c -I ... -L ... -l xxxx -o main 2直接把可执行文件下载到开发板运行 4. 动态库与静态库的区别 二进制的封装 区别 对于动态库对使用动态库的代码 编译 并没有把动态库编译进去 仅仅做一个标记:我的这个可执行程序在运行会用到某某某动态库 对于静态库对使用静态库的代码 编译只把静态库的内容拷贝到可执行文件当中 动态库的优点 当接口一致(函数名 参数 返回值的时候更新动态库不需要重新编译依赖动态库的可执行程序 a.out 静态库 修改则需要重新编译所依赖的可执行程序