Linux系统编程03-动态库

动态库制作

  • 命名规则
    • Linux: libxxx.so
      • lib: 前缀
      • xxx: 库的名字
      • .so: 后缀
    • Windows: libxxx.dll
  • 制作:
    • gcc 生成 .o 文件, 得到和位置无关的代码 gcc -c -fpic/fPIC a.c b.c
    • gcc 生成动态库 gcc -shared a.o b.o -o libcalc.so

实例:

add.c

#include <stdio.h>
#include "head.h"
int add(int a, int b)
{
    return a+b;
}

div.c

#include <stdio.h>
#include "head.h"
double divide(int a, int b)
{
    return (double)a/b;
}

mult.c

#include <stdio.h>
#include "head.h"
int multiply(int a, int b)
{
    return a*b;
}

sub.c

#include <stdio.h>
#include "head.h"
int subtract(int a, int b)
{
    return a-b;
}

head.h

#ifndef _HEAD_H
#define _HEAD_H

// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);

#endif

main.c

#include <stdio.h>
#include "head.h"

int main()
{
    int a = 20;
    int b = 12;
    printf("a = %d, b = %d\n", a, b);
    printf("a + b = %d\n", add(a, b));
    printf("a - b = %d\n", subtract(a, b));
    printf("a * b = %d\n", multiply(a, b));
    printf("a / b = %f\n", divide(a, b));
    return 0;
}
  1. 生成位置无关代码 gcc -c -fpic add. c div.c mult.c sub.c 生成目标文件

  2. 生成动态库gcc -shared *.o -o libcalc.so

  3. 整理目录:

  1. 使用动态库: gcc main.c -o main -I ./include -L ./lib -l calc

  2. 执行main 时会报错 error while loading shared libraries: libcalc.so : cannot open shared object file: No such file or directory

定位共享库文件

环境变量方法

  • env 可以查看环境变量

  • 临时配置export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib

  • 用户级别的配置, 打开.bashrc, 最下面输入export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib, 输入 source .bashrc生效(推荐此方法)

  • 系统级别的配置 sudo vim /etc/profile, 最下面输入export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib, source /etc/profile生效

  • 使用 ldd main 查看动态库

  • 使用 ldd main 查看动态库

    linux-vdso.so.1 (0x00007ffe9bdee000)
    libcalc.so => /home/xxx/lib/libcalc.so (0x00007fe7524f6000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe7522f1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fe752502000)
    
  • 运行程序 ./main

    a = 20, b = 12
    a + b = 32
    a - b = 8
    a * b = 240
    a / b = 1.666667
    

修改文件方法

无法直接修改/etc/ld.so.cache, 需要编辑sudo /etc/ld.so.conf, 添加动态库的路径, 更新sudo ldconfig 即可

放入指定目录方法

直接放入 /lib/, /usr/lib目录, 系统的动态载入器能直接扫描到. (不推荐此方法)

posted @ 2022-10-14 22:02  言叶以上  阅读(20)  评论(0编辑  收藏  举报