尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

静态库和动态库

静态库和动态库 目录1. 库2. 动态库2.1 创建动态库1. 编写源码xxx.c功能逻辑实现文件xxx.h函数声明、自定义类型对外接口文件2. 编译生成目标文件动态库必须加 -fPIC3. 打包生成动态库2.2 使用动态库运行找不到库的解决办法1. 临时生效终端关闭失效2. 永久生效PC UbuntuRK3568 ARM 开发板动态库部署特点3. 静态库3.1 创建静态库3.2 使用静态库4. 核心性能总结5. 两种库适用场景静态库适用场景动态库适用场景6..静态库和动态库的区别第一个区别第二个区别1. 库库是二进制代码封装形式由多个.c 文件预先编译成二进制函数集合。对外只提供.h 头文件作为接口使用者无法查看底层源码实现。使用库的作用封装核心业务代码只交付二进制文件保护技术不泄露。Linux 系统默认库存放路径/lib系统开机运行必需的底层库/usr/lib系统、第三方软件公用库补充编译工具说明Ubuntu 自带 gcc编译出 x86 架构程序仅能在电脑本地运行若程序要在 ARM 开发板运行需使用交叉编译器交叉编译器一般由开发板厂商提供也可自行下载。书写规范(arm-linux-)gcc括号代表可选本地 PC 编译用 gcc交叉编译 ARM 板子使用 arm-linux-gcc。2. 动态库2.1 创建动态库1. 编写源码xxx.c功能逻辑实现文件xxx.h函数声明、自定义类型对外接口文件示例文件sum.c sum.h sub.c sub.h2. 编译生成目标文件动态库必须加 -fPIC(arm-linux-)gcc sum.c -c -fPIC -o sum.o (arm-linux-)gcc sub.c -c -fPIC -o3. 打包生成动态库封装库(arm-linux-)gcc-shared -fPIC -olib库名.so文件列表动态库命名规范以 lib 开头后缀.so(arm-linux-)gcc -shared -fPIC -o libmymath.so sum.o sub.o参数释义• -shared标识生成动态共享库• -fPIC生成位置无关代码• -o指定输出库文件名称补充-fPIC 位置无关代码详解PIC 全称 Position-Independent Code位置无关代码。不加 - fPIC 的普通目标文件代码内写死全局变量、函数的绝对内存地址要求程序加载到固定内存地址才能正常运行。动态库运行特性程序启动时操作系统会将.so 加载到进程内存任意地址每次加载地址不固定。-fPIC 作用代码全部采用相对偏移寻址不硬编码绝对地址无论.so 加载到内存哪个位置都能正常访问函数与全局变量。关键点动态库制作必须添加 - fPIC静态库编译无需该参数。2.2 使用动态库交付文件头文件 libxxx.so编译主程序命令(arm-linux-)gcc main.c -I ../inc -L ../lib -l mymath -o main参数释义-I(大写i) 目录指定头文件搜索路径可同时写多个 - I-L 目录指定库文件存放搜索路径-l(小写L)库名自动匹配 lib 库名.so运行找不到库的解决办法报错提示error while loading shared libraries: xxx.so1. 临时生效终端关闭失效export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/mnt/hgfs/xxx/lib2. 永久生效PC Ubuntusudo cp libmymath.so /usr/libRK3568 ARM 开发板cp libmymath.so /lib动态库部署特点可执行程序与动态库相互独立、互相依赖将程序传到 ARM 开发板时必须同步上传对应的.so 库文件否则程序无法启动。3. 静态库3.1 创建静态库1. 编写源码sum.c sum.h sub.c sub.h2. .c 编译生成.o 目标文件静态库不需要 - fPIC(arm-linux-)gcc sum.c -c -o sum.o (arm-linux-)gcc sub.c -c -o sub.o3. ar 工具打包生成静态库静态库命名规范以 lib 开头后缀.aar -rc libmymath.a sum.o sub.o参数释义r插入 / 替换归档内的目标文件c创建新的归档库文件3.2 使用静态库交付文件头文件 libxxx.a编译链接命令(arm-linux-)gcc main.c -I ../inc -L ../lib -l mymath -o main_1静态库部署特点编译链接阶段静态库内部所有代码完整拷贝进可执行文件只需将生成的可执行文件上传开发板运行不需要同步拷贝静态库。4. 核心性能总结静态库编译链接时把库代码嵌入程序运行无外部依赖牺牲磁盘、内存空间效率换取更好的启动与执行效率。动态库编译仅记录库引用运行时加载库文件多程序共享同一份库代码牺牲少量启动、调用执行效率换取磁盘与内存空间复用效率。5. 两种库适用场景静态库适用场景资源极度受限的嵌入式设备系统不支持动态库需要单文件分发、绿色免部署的工具程序规避库缺失、库版本不兼容类运行故障。动态库适用场景多个程序共用同一套公共工具库节省磁盘与内存插件化、模块化开发单独更新模块无需重编译主程序大型软件控制安装包整体体积。6..静态库和动态库的区别第一个区别静态库牺牲了空间效率 换取了执行效率 动态库牺牲执行效率 换取了空间效率对于静态库编译文件时会把静态库的内容拷贝到可执行文件中运行可执行文件时就不需要加 载静态库但是这会导致最终可执行文件的代码量增多相当于编译器把代码补充完整这样运行的时 候这样运行效率相对快一点但是会有一个缺点占用磁盘和内存空间。对于动态库编译文件时并没有把动态库的内容拷贝到可执行文件中去只是做了标记标记可执 行文件需要用 xxx动态库 这样的话 运行可执行文件时 先去加载程序所依赖的动态库第二个区别当函数的接口不变时更新动态库不需要重新编译该动态库的工程文件如果静态库修改则需要重新编译依赖该静态库的工程文件
返回列表