有两个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\n",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  

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

  

gcc 编译两个so其中soA依赖soB的更多相关文章

  1. gcc编译时对'xxxx'未定义的引用问题

    gcc编译时对’xxxx’未定义的引用问题 gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没 ...

  2. gcc编译时对’xxxx’未定义的引用问题

    gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没有问题,但是编译(这一步应该是链接)为可执行 ...

  3. gcc编译命令行依赖库的指定顺序

    gcc链接过程中定义了三个集合:可重定位目标文件集合E.未解析符号集合U和已定义符号集合D,链接基本流程如下: 1) 按命令行指定顺序依次处理每个目标文件和库文件: 2) 如果为目标文件,将其加入集合 ...

  4. 在Linux下使用gcc编译mesa文件报undefined reference to symbol 'sin@@GLIBC_2.2.5和DSO missing from command line两个错误的解决方案

    一.概述 在Linux系统下使用gcc编译用C语言写的mesa的示例程序. 环境:Ubuntu Server 18.04.1 二.问题的出现 在Ubuntu下安装好mesa所需的库文件,将目标文件从g ...

  5. GCC 编译优化指南(转)

    GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...

  6. CentOS离线安装GCC编译环境

    gcc编译环境rpm下载 安装相关的rpm包,具体版本可能随时间变化而变化,可以去以下地址下载: 重庆大学镜像:http://b.mirrors.lanunion.org/CentOS/中国科学技术大 ...

  7. C++常见gcc编译链接错误解决方法

    除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdy ...

  8. GCC 编译详解

    GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Jav ...

  9. gcc编译, gdb调试, makefile写法

    //test.c: #include <stdio.h> int main(void) { printf("hello world!"); return 0; } == ...

随机推荐

  1. TensorFlow NMT的数据处理过程

    在tensorflow/nmt项目中,训练数据和推断数据的输入使用了新的Dataset API,应该是tensorflow 1.2之后引入的API,方便数据的操作.如果你还在使用老的Queue和Coo ...

  2. scala快速入门之文档注释

    scala快速入门之文档注释 1.在项目栏的目录树中找到该源码,右击点击Show in Explorer, 即可找到该源码的本地路径,在路径中输入cmd 2.执行scaladoc -d  生成文档注释 ...

  3. 树莓派安装realvnc_server

    先 sudo raspi-config 打开VNC. 然后去realvnc官网去下载raspberry的vncserver 已经ssh连接的前提下可以电脑下载后使用scp命令转移到树莓派上,使用以下命 ...

  4. ubuntu坑(持续更新~)

    0.you should not install packages from any repository that represents a different system version to ...

  5. Linux下如何退出vim的一些常用命令总结

    1.保存并退出 linux下安装好了vim以及gcc后,我们开始新建一个c文件,例如: vim test.c 之后进入vim的编辑框中,点击i进入插入模式,开始编辑程序,当你编写好自己的程序之后,按E ...

  6. 项目Beta冲刺(团队)——05.29(7/7)

    项目Beta冲刺(团队)--05.29(7/7) 格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺(团队) 团队名称:为了交项目干杯 作业目标:记录Beta敏捷冲刺第7 ...

  7. python应用-craps赌博游戏

    from random import randint face1=randint(1,6) face2=randint(1,6) first_point=face1+face2 print('玩家摇出 ...

  8. Ruby Raise rescue

    ruby1.9以上,retry只能支持在rescue里面使用,不支持在block里面用:你要去用ruby1.8 rescue使用代码例子 # -*- coding: UTF-8 -*- n = 0 b ...

  9. GeoIP简介与资源,定位经纬度,获取用户IP

    所谓GeoIP,就是通过来访者的IP,定位他的经纬度,国家/地区,省市,甚至街道等位置信息.这里面的技术不算难题,关键在于有个精准的数据库.有了准确的数据源就奇货可居赚点小钱,可是发扬合作精神,集体贡 ...

  10. Goland在go mod vendor模式下无法识别某些库

    症状:go build可以正常编译,但代码编辑器里面提示找不到相关lib,后来发现是因为go.mod中没有用require这个库,补上库地址和版本.因为项目的mod vendor模式,版本一般不需要写 ...