【C++】动态库制作和链接

1. 动态库的制作

1.1 动态库命名规则:

Linux:libxxx.so

  • lib:固定前缀
  • xxx:库的名字,自己起名
  • .so:固定后缀
  • 在linux下是一个可执行文件

Windows:libxxx.dll

1.2 动态库制作:

先 gcc 编译源文件,生成和位置无关的 .o 文件

gcc -c -fpic/-fPIC a.c b.c

再 gcc 编译得到动态库

gcc -shared a.o b.o -o libcalc.so

2. 静/动态库工作原理

  • 静态库:GCC 进行链接时,会把静态库中代码打包到可执行程序中
  • 动态库:GCC 进行链接时,动态库的代码不会被打包到可执行程序中
  • 程序启动之后,动态库会被动态加载到内存中,通过 ldd (list dynamic dependencies)命令检查动态库依赖关系(此时 libcalc.so 动态库未链接,显示 not found)【C++】动态库制作和链接_第1张图片
  • 如何定位共享库文件呢?
    当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于 elf 格式的可执行程序,是由 ld-linux.so 来完成的,它先后搜索 elf 文件的 DT_RPATH段 ——> 环境变量 LD_LIBRARY_PATH ——> /etc/ld.so.cache 文件列表 ——> /lib/,/usr/lib 目录找到库文件后将其载入内存。
    一般通过修改 LD_LIBRARY_PATH 的方式来链接到动态库,此处也是记录这种方式的两种方法。
    1. 直接通过 export 命令修改路径,但是这种方式一次性生效,退出当前终端后即失效。
      1.1 复制动态库根目录
      在这里插入图片描述
      1.2 通过 export 命令修改 LD_LIBRARY_PATH
      在这里插入图片描述
      1.3 成功之后通过 ldd 命令查看 main 执行文件,已经可以找到动态库在这里插入图片描述

    2. 在根目录下的 .bashrc 文件中修改 LD_LIBRARY_PATH 。
      2.1 使用 vim ~/.bashrc 命令修改 .bashrc 文件,在其中新加一行:
      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/lbr/linux_network_program/lession06/library/lib
      添加完成后退出文件,并使用 source ~./bashrc 命令刷新一下文件
      2.2 添加并刷新完成后,使用 ldd main 可以查看可执行文件 main 的动态库链接情况,可以看到已经成功链接,程序可以顺利运行。【C++】动态库制作和链接_第2张图片

你可能感兴趣的:(c++,linux,开发语言)