zoukankan      html  css  js  c++  java
  • gcc 编译两个so其中soA依赖soB

    有两个so,其中soB中调用soA;

    那么我们打包soB的时候连接soA;

    在打包test程序的时候连接soB,此时soB会自动查找依赖的soA;

    如下测试

    在编译之前指定环境变量:export LD_LIBRARY_PATH=./

    soA

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

     编译成so

    	gcc -shared -fPIC -o libadd.so add.c
    

      

    soB

    #include <stdio.h>
    
    extern int add(int a,int b);
    
    int cal(int a,int b){
    
    	return (add(a,b)+1);
    
    }
    

      编译成so,编译时连接soA,就是 -ladd

    	gcc -shared -fPIC -o libcal.so cal.c -L. -ladd
    

      

    测试程序test.c

    #include <stdio.h>
    
    
    extern int cal(int a,int b);
    
    int main(void)
    {
    	printf("%d
    ",cal(11,10));
    	return 0;
    }
    

      编译测试程序,这里我们只是连接了cal,没连接add

    	gcc test.c  -o test -L. -lcal

    最后运行test

    由于我们前面指定的环境变量,可以这么做,如果不指定环境变量,默认会从系统的库路径下查找,那么找不到so,就无法编译我们的测试程序;

    完整的Makefile

    all:
    
    	gcc -shared -fPIC -o libadd.so add.c
    	gcc -shared -fPIC -o libcal.so cal.c -L. -ladd
    	gcc test.c  -o test -L. -lcal
    
    
    clean:
    	rm -rf test
    	rm -rf *.so  

    使用之前要提前设置环境变量;

      

  • 相关阅读:
    Node.js 安装配置
    ITerm2配置-让你的mac命令行更加丰富高效
    ECharts 图表工具
    Vue 安装
    element-ui 安装
    mysql高级查询
    数据库第三章 参考
    DML和DQL 总结
    数据库第二章 参考答案
    数据库编程技术 第一章
  • 原文地址:https://www.cnblogs.com/cocoajin/p/10904646.html
Copyright © 2011-2022 走看看