动态库,静态库的编译

概述

生成静态、动态链接库的过程

查看文件依赖库命令 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

打包方式

  1. 创建打包的.o文件:gcc -fPIC -c [.c文件]

    PIC:position ignoring code 与位置无关的代码

  2. gcc -shared 打包 .o 文件:gcc -shared -o [lib动态链接库名.so] [需要打包的.o文件]

    -shared:共享库/动态库

可以合并写在一起如下:

gcc example.c -fPIC -shared -o example.dll

调用方式

动态库跟静态库不一样,需要将 .so 文件,放到系统的默认路径下,才能被执行文件找到

运行时,系统查到动态库的方法:

  1. 环境变量:LD_LIBRARY_PATH,添加库的所在路径(这是个临时方案,重启机器可能会无效)

  2. 在 lib64 或者 /user/lib64 下创建三方库的软连接 ln -s [动态库文件路径] [/lib64/[库名称]]

  3. /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

  1. 编译器,在链接的时候,如果提供的库,既有动态库又有静态库,优先采用动态链接库。如果只有静态库,直接链接静态库。
  2. 静态库删除了不影响可执行程序运行(生成可执行程序的时候,已经将静态库打包到可执行文件)。而动态库删除后,程序不能运行(动态加载的系统内存,映射到进程空间)。
  3. 云服务器一般只有动态链接库,静态链接库需要自己手动安装。
# 安装 C 静态库
yum install -y glibc-static
# 安装 C++ 静态库
yum install -y libstdc++-static

查看可执行文件使用的动态库还是静态库

  • 通过file命令查看文件的链接属性
  • 通过 ldd 命令查看可执行文件的依赖库
最后修改日期: 27 2 月, 2025

作者

留言

撰写回覆或留言