1.库是什么?
库是写好的,现有的,成熟的,可以复用的代码。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。即为源代码的二进制文件
2.库的类型
1)在Windows中,.dll后缀为动态库,.lib后缀为静态库。
2)在Linux中,.so后缀为动态库,.a则为静态库
3.动态库与静态库的优缺点
1)静态库:
在程序执行前(编译)就加入到目标程序中
优点:
①静态库被打包到应用程序中,加载,运行速度快
②发布程序无需提供静态库,因为已经在app中,移植方便
缺点:
①大,相同的库文件可能在内存中被加载多份,消耗系统资源,浪费内存
②库文件更新需要重新编译项目文件,生成可执行程序,浪费时间
2)动态库:
在程序执行时动态(临时)由目标程序去调用
优点:
①程序更轻量,
②可实现不同进程间的资源共享
③动态库升级简单,只需要替换库文件,无需重新编译应用程序
④可以控制何时加载动态库,不调用库函数动态库不会被加载
缺点:
①程序运行,加载速度相比用静态库慢
②发布程序需要提供依赖的动态库
4.静态库的制作与使用
1)静态库制作:
① gcc xxxxxx.c -c 生成 xxxxxx.o文件
②ar rcs libxxxxxx.a xxxxxx.o 由xxxxxx.o文件生成libxxxxxx.a静态库
2) 静态库使用:
① gcc 主程序.c -lxxxxxx -L ./ -o xxxx 编译程序后,库就加载到程序中了。在执行此xxx程序的时候,不需要接库(可对比下面调用了动态库的程序运行方式)
-lxxxxxx -l是指定要用的静态库,库名砍头去尾, -L是告诉gcc 编译器从-L指定的路径去找静态库。默认是从/usr/lib /usr/local/lib 去找
-o xxx 将编译出来的程序命名为xxx
5.动态库的制作与使用
1)动态库制作:
① gcc -shared -fpic xxxxxx.c -o libxxxx.so 直接用此指令以xxxxxx.c 生成llibxxx.so的动态库
-shared 指定生成动态库 -fpic 此选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码
2)动态库使用:
①(编译) gcc 主程序.c -lxxxx -L ./ -o xxx -l是指定要用的动态库,库名砍头去尾, -L是告诉gcc 编译器从-L指定的路径去找静态库。默认是从/usr/lib /usr/local/lib 去找
②(运行)直接./xxx运行发现报错,解决方式:
⑴ sudo cp libxxxx.so /usr/lib/ 将库复制到/usr/lib/再运行即可,因为程序默认回到此文件夹下找库
⑵ export LD_LIBRARY_PATH="动态库所在的文件夹的绝对路径" 再运行程序 设置环境变量 (常用)但此环境变量是临时的换个ssh的窗口就不行了。所以往往会写一个shell脚本
脚本内容为这句话,加主程序。
例如xxx.sh:
export LD_LIBRARY_PATH="/home/pi/back/test"
./xxxx
标签:gcc,lib,静态,创建,xxx,优缺点,usr,动态 From: https://www.cnblogs.com/hetaoBlog/p/17145703.html