文章目录
总纲
1基本概念
1作用
- 分离编译
- 代码重用
2动态库和静态库的区别
- 静态库:
- 在可执行程序运行前就加入到执行码中,成为执行程序的一部分
- 一个或多个.o目标文件归档在一个文件中
- 对空间要求较低,而对时间要求较高的核心程序中
- 动态库:
- 在可执行程序运行启动时加入到执行程序中,可以被多个可执行程序共享使用
- 没有main函数的可执行文件
- 对时间要求较低,而对空间要求较高的
静态库:
优点是,在编译后的执行程序不再需要外部的函数库支持,运行速度相对快些;
缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译。
动态库 :
优点是,动态库的改变并不影响你的程序,所以动态函数库升级比较方便;
缺点是,因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。
2静态库的制作
2.1创建
- 编译源文件:生成静态库的材料
g++ -c -o test.o test.cpp
- 生成静态库
ar -rcs libtest.a test.o //libtest.a是动态库的名字
命令选项 | 作用 |
---|---|
r | 替换模块(replace) |
c | 创建库(create) |
s | 建立索引 |
2.2使用
-
注意:库一定要放在命令行的末尾
- 链接静态库
g++ -o main main.cpp -L. -l库民
g++ -o main main.cpp ./lib库名.a
2.3函数的隐士声明
- 返回值类型只有int型,
- 错误出现(因为该文件编译时还没有连接库,所以发现不了这些文函数,所以在文件中隐士声明了这些函数)
- 解决方法:头文件加声明
2.4tar和ar都是归档工具
- tar用于创建.tar归档文件。
- ar用于创建归档文件,并且为归档的目标文件中的符号建立索引。
3动态库制作及使用
3.1创建
- 编译目标文件:生成制作动态库的材料
g++/gcc -c test.cpp -o test.o -fPIC //(生成与位置无关的代码 -fPIC)
- 生成动态库
g++/gcc -shared lib库名.so text.o
3.2使用
- 编译可执行程序时,指定所使用的动态库。-l:库名 -L:指定库路径
gcc text.c -o a.out -lmymath -L./lib
- 运行可执行文件 ./a.out
4动态库加载错误愿因和结局方法
- 运行可执行文件 ./a.out:但是会出错可是我给了位置和库名,为什么还会出错?:因为动态链器器提供动态库所在目录位置,但是只会在固定目录寻找动态库,如果找不到就报错。
- 原因 (动态链接器报错)
- 链接器:工作于链接状态,工作需要-l 和 -L
- 动态链接器: 工作于程序运行时间。工作的时候需要提供动态库所在目录位置。
- 改正方法
- 临时生效
- 改变环境变量export LD_LIBRARY_PATH=./lib( 终端重启环境变量实失效)
- 永久生效方法1:
- vim ~./bashrc(环境变量的配置文件)
- 写入 export LD_LIBRARYPATH=动态库路径
- …bashrc/ source.bashrc /重启 终端
- 永久生效方法2:
- 拷贝自定义动态库 到/lib(标准C库所在目录中)
- 永久生效方法3:
- vim /etc/ld.so.conf
- 写入动态库绝对路径保存
- sudo ldconfig -v使配置文件生效
- ./a.out 成功
- 临时生效
- 原因 (动态链接器报错)
5注意点
- 当静态库和动态库同名时, gcc命令将优先使用动态库。
- 查看执行文件链接的动态链接库
ldd 可执行文件