• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Linux动态链接库的使用

    动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。

    针对二进制文件有用的命令

    查看文件类型

    file

    查看二进制文件链接到哪些库

    ldd

    查看二进制文件里面所包含的symbol,T表示加载,U表示undefined symbol

    nm

    读二进制文件里面的信息

    readelf -a smu.o
    

    将二进制文件转换为汇编

    objdump -d sum.o

    动态链接库的生成

    sum.c

    #include <stdio.h>
    #include <stdlib.h>
    
    int sum(int x){
     int i, result=0;
     for(i=0; i<=x; i++){
      result+=i;
      }
     if(x > 100)
      exit(-1);
     return result;
    };
    
    void display(char* msg){
     printf("%s\n",msg);
    }
     
    int add(float a,float b){
     return a+b;
    }
    
    int sum_array(int array[], int num){
     int i =0, sum = 0; 
     for(i=0; i<num; ++i) 
      sum += array[i];
     return sum;
    }
    
    void modify_array(int array[], int num){
     int i =0, sum = 0; 
     for(i=0; i<num; ++i) 
      array[i] *= 10;
    }
    
    

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void){
     int x;
     printf("Input an integer:\n");
     scanf("%d", &x);
     printf("sum=%d\n", sum(x));
     return 0;
    };
    
    

    生成可执行文件

    gcc -c main.c -o main.o
    gcc -c sum.c -o sum.o
    gcc sum.o main.o

    将会生成main的可执行文件

    file main  // ELF 64-bit LSB executable
    file sum.o // ELF 64-bit LSB relocatable
    

    因为sum.c里面含有可复用的函数,所以想把sum.c编译成为一个动态链接库

    gcc sum.o -shared -o sum.so

    出现错误,提示

    /usr/bin/ld: sum.o: relocation R_X86_64_PC32 against undefined symbol `exit@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
    /usr/bin/ld: final link failed: Bad value
    collect2: error: ld returned 1 exit status

    这说明不是所有的.o文件都能编译成为动态链接库,需要在.o文件生成时加参数-fPIC

    gcc -c sum.c -fPIC -o sum.o
    gcc sum.o -o shared sum.so
    

    一般,共享库的编译命令为(曾经的实验)

    动态链接库

    gcc -shared -fPIC -o libmyhello.so hello.o
    gcc -o hello main.c -L. -lmyhello
    

    静态链接厍

    ar rcs libxx.a xx.o 
    g++ -o main main.cpp -static -L. -lxx
    

    这时候再

    g++ -o main main.c sum.so
    ./main 
    

    有时会报错

    error while loading shared libraries: sum.so: cannot open shared object file: No such file or directory

    ldd main
    output:
    sum.so => not found
    

    这时候需要

    export $LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH

    注意:-fPIC是生成.o时使用,-shared是用来生成动态链接库的

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    上一篇:Linux运维从初级进阶为高级知识点总结
    下一篇:Windows安装MySQL8.0.16 的步骤及出现错误问题解决方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Linux动态链接库的使用 Linux,动态,链接,库,的,使用,