3. 静态库的制作
1>. 命名规则
1). lib + 库的名字 + .a
2). libmytest.a
2>. 制作步骤:
1). 生成对应的.o文件 -- .c --> .o -c : gcc -c *.c -I ../include
2). 将生成的.o文件打包成静态库 : ar rcs + 静态库的名字(libMytest.a) + 生成的所有的.o ,生成.a文件后mv到lib目录下
ar rcs libmytest.a a.o b.o c.o
(就是一个打包.o文件的过程)
ar 工具不包含在gcc中
r --> 将文件插入静态库中
c --> 创建静态库,不管库是否存在
s --> 写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。
3>. 发布和使用静态库:
1). 发布静态库
2). 头文件
3.1 使用:两种方法
写一个main.c文件测试程序。
a)编译文件:gcc main.c ../lib/libmyapp.a -o myapp -I ../include/
gcc + 需要打包的文件和静态文件 + 目标文件 + 用到的目录
b)gcc main.c -I include -L lib -l myapp -o myapp
gcc + 源文件 +头文件+ 静态库+指定库名(libmyapp.a去掉lib和.a) +目标文件
4>. 优缺点:
1)优点:a 发布程序时,不需要提供对应的库 b 加载库的速度快
2)缺点:a 库被打包到应用程序中,导致库的体积大 b 如果库发生改变,需要重新编译程序,升级较麻烦
4. 共享库的制作:共享库也叫动态库
1>. 命名规则:
1). lib + 名字 + .so
2>. 制作步骤:
1). 生成与位置无关的代码 (生成与位置无关的.o) :gcc -fPIC -c *.c -I ../include
2). 将.o打包成共享库(动态库) :gcc -shared -o libmytest.so *.o -Iinclude 。生成的.so文件mv到lib目录下。
3>. 发布和使用共享库:
生成可执行程序:
1 gcc main.c lib/libmytest.so -o myapp -Iinclude
2 gcc main.c -I include -L lib -l mytest -o myapp
4>. 解决程序执行时运行失败,查看依赖的共享库:ldd myapp 发现 libmytest 找不到
原因是没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径。
解决方案:第四种常用
1). 放到系统的库目录 中 /lib/-- 不允许使用
2). 临时测试: export LD_LIBRARY_PATH=目录
环境变量: LD_LIBRARY_PATH=将动态库的路径设置给该变量
将设置的值, 导入到系统环境变量中: export
当终端关闭, 设置会失效
3). 不常用的方法(永久设置): .bashrc
在家目录的 .bashrc文件 中添加一句话: export LD_LIBRARY_PATH=动态库目录的绝对路径
.bashrc修改完成, 需要重启终端
4).
1. 需要找动态连接器的配置文件 -- /etc/ld.so.conf
2. 动态库的路径写到配置文件中 -- 绝对路径
3. 更新 -- sudo ldconfig -v
tar zxvf
tar jcvf
5>. 优缺点:
优点:
1动态库在程序执行过程中才会被加载到内存中,执行程序体积小
2如果动态库更新,不需要重新编译程序,(前提接口不能变)
缺点:
1 发布程序时需要把动态库提供给用户
2 动态库没有被打包到应用程序中,加载速度相对静态库慢
静态库和动态库的制作
最新推荐文章于 2024-03-31 19:37:29 发布