动态库,静态库的编译
概述
生成静态、动态链接库的过程
查看文件依赖库命令 ldd
[toc]
静态库
命名规则
- linux:
lib + {库名称} .a + {版本号}
- windows:
{库名称}.lib
- mac:
lib + {库文件} .a + {版本号}
打包方式
ar -rc [lib库名称.a] [需要打包的.o文件]
- -r:更新替换库文件
- -c:创建新库
调用方式
要将三方库引入项目,需要让编译器找到库和头文件,需要指定库文件路径,库名,头文件地址。
gcc -o [目标文件] [c/cpp源文件] -I [头文件的路径] -L[库文件的路径] -l[去掉头尾的库名]
动态库
命名规则
- linux :
lib + {库名称} + .so + {版本号}
,test 库,文件命名为libtest.so
-
windows:
{库名称} + .dll
- mac:
{库名称} + .dylib
打包方式
-
创建打包的
.o
文件:gcc -fPIC -c [.c文件]
PIC:position ignoring code 与位置无关的代码
-
gcc -shared
打包.o
文件:gcc -shared -o [lib动态链接库名.so] [需要打包的.o文件]
-shared:共享库/动态库
可以合并写在一起如下:
gcc example.c -fPIC -shared -o example.dll
调用方式
动态库跟静态库不一样,需要将 .so
文件,放到系统的默认路径下,才能被执行文件找到
运行时,系统查到动态库的方法:
- 环境变量:
LD_LIBRARY_PATH
,添加库的所在路径(这是个临时方案,重启机器可能会无效) -
在 lib64 或者 /user/lib64 下创建三方库的软连接
ln -s [动态库文件路径] [/lib64/[库名称]]
-
在
/etc/ld.so.conf.d/
中添加配置文件,写入三方库的路径# 在对应系统路径下添加一个配置文件 sudo touch /etc/ld.so.conf.d/myconf.conf # 编辑配置文件,将三方库路径添加到文件中 vim /etc/ld.so.conf.d/myconf.conf # 使配置文件生效 ldconfig
示例
g++ test.cpp -o test -I./incluce -L. -lexample
-L
后跟库文件的路径-l
后跟动态库的名称-I
后跟动态库的头文件路径
注意
动态库和静态库同时存在,系统默认采用动态链接库。如果需要连接静态库,需要指定参数 -static
gcc -o [目标文件] [c/cpp源文件] -I [头文件的路径] -L[库文件的路径] -l[去掉头尾的库名] -static
- 编译器,在链接的时候,如果提供的库,既有动态库又有静态库,优先采用动态链接库。如果只有静态库,直接链接静态库。
- 静态库删除了不影响可执行程序运行(生成可执行程序的时候,已经将静态库打包到可执行文件)。而动态库删除后,程序不能运行(动态加载的系统内存,映射到进程空间)。
- 云服务器一般只有动态链接库,静态链接库需要自己手动安装。
# 安装 C 静态库
yum install -y glibc-static
# 安装 C++ 静态库
yum install -y libstdc++-static
查看可执行文件使用的动态库还是静态库
- 通过
file
命令查看文件的链接属性 - 通过
ldd
命令查看可执行文件的依赖库
留言