Linux 程序 动态库 静态库依赖关系,在执行程序的时候,已经比较熟悉了,但是在编译过程中,一直还有点疑问。

比如:

1、app 依赖 动态库A,动态库A依赖静态库B

2、app 依赖 动态库A,动态库A依赖动态库B

3、app 依赖 静态库A,静态库A依赖动态库B //这种我目前没有成功,感觉实现不了

3、app 依赖 静态库A,静态库A依赖动态库B (这种可以实现,只是在编译app的时候需要依赖AB库)

4、app 依赖 静态库A,静态库A依赖静态库B

针对情况1:

编译的时候,先编译静态库B,编译静态库B的时候,加上 -shared -fPIC参数

然后编译动态库A的时候,让动态库A依赖静态库B      //这样可以把静态库编译进动态库里面

然后编译app的时候,只依赖动态库A就可以了

程序执行的时候,app就只依赖动态库A。

注:在编译动态库A的时候,可以选择不依赖静态库B。只是这样在编译app的时候,app需要同时依赖动态库A和静态库B。且动态库必须在静态库的前面。

针对情况2:

编译的时候,分别编译动态库A和B。动态库A和B的编译顺序可以任意,两者是独立的。

编译app的时候,依赖动态库A和B。这个时候动态库A必须在动态库B的前面。比如:

gcc -o test main.c -L./ -lfun_A -lfun_B

针对情况3:

这种情况无法实现。静态库无法依赖动态库。

针对情况4:

和情况二一致。

编译的时候,分别编译静态库A和B。静态库A和B的编译顺序可以任意,两者是独立的。

编译app的时候,依赖静态库A和B。这个时候静态库A必须在动态库B的前面。比如:

gcc -o test main.c -L./ -lfun_A -lfun_B

涉及到的代码如下:

.
├── fun_1.c
├── fun_1.h
├── fun_2.c
├── fun_2.h
├── main.c
├── make_app_share_share.sh
├── make_app_share_static.sh
├── make_app_static_static.sh
└── readme.txt
注:之前说到的A和B分别对应2和1.即fun_2依赖fun_1

fun_1.c

#include <stdio.h>int fun1(void)
{printf("this is fun1.\n");return 0;
}

fun_1.h

#ifndef _FUN_1_
#define _FUN_1_
int fun1(void);#endif

fun_2.c

#include <stdio.h>
#include "fun_1.h"int fun2(void)
{printf("this is fun2.Immediately call fun1.\n");fun1();return 0;
}

fun_2.h

#ifndef _FUN_2_
#define _FUN_2_int fun2(void);#endif

main.c

#include <stdio.h>
#include "fun_2.h"int main()
{printf("this is main.\n");fun2();return 0;
}

make_app_share_share.sh

#!/bin/bash#先编译生成动态库
gcc -o libfun_1.so fun_1.c -shared -fPICgcc -o libfun_2.so fun_2.c -shared -fPIC gcc -o app_share_share main.c -L./ -lfun_2 -lfun_1export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./
./app_share_sharerm app_share_share libfun_1.so libfun_2.so

make_app_share_static.sh

#!/bin/bash
#app依赖动态库,动态库依赖静态库#先编译生成静态库
#gcc -o fun_1.o -c fun_1.c -shared -fPIC
gcc -o fun_1.o -c fun_1.c
ar -r libfun_1.a  fun_1.o    gcc -o libfun_2.so fun_2.c  -shared -fPIC -L./ -lfun_1gcc main.c -o app_share_static -L./ -lfun_2export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./
./app_share_staticrm libfun_1.a  fun_1.o libfun_2.so app_share_static

make_app_static_static.sh

#!/bin/bash
#app依赖动态库,动态库依赖静态库#先编译生成静态库
gcc -o fun_1.o -c fun_1.c -shared -fPIC     #推荐这种方式编译静态库
#gcc -o fun_1.o -c fun_1.c                  #不推荐这种方式编译静态库
ar -r libfun_1.a  fun_1.o    gcc -o fun_2.o -c fun_2.c -shared -fPIC
ar -r libfun_2.a  fun_2.o    gcc main.c -o app_static_static -L./ -lfun_2 -lfun_1./app_static_staticrm libfun_1.a  fun_1.o libfun_2.a fun_2.o app_static_static

readme.txt

对应的源码下载链接:https://download.csdn.net/download/a3121772305/85116199

Linux 程序 动态库 静态库依赖关系相关推荐

  1. linux系统下的“静态库和动态库”专题之一:库的概念和规则

    什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的本质不同,因此二者的库也是不兼 ...

  2. linux库--静态库、动态库

    文章目录 一.分文件编程思想 二.动态库静态库 1.概念介绍 2.静态库的制作和使用 3.动态库的制作和使用 一.分文件编程思想 好处: 分模块的编程思想 例如: 网络 a 超声波b 电机c a.功能 ...

  3. linux系统下的“静态库和动态库”专题之二:库的创建和使用

    接上文[linux系统下的"静态库和动态库"专题之一:库的概念和规则]所述,我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种. – 静态库在程序编译 ...

  4. linux库引入之动态库静态库(生成和使用)

    库: 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容. 如何使用 用户需要同时具有头文件和库. ...

  5. Linux快速入门之 静态库和动态库 (07)

    文章目录 7.静态库和动态库 7.1 Linux下静态库 7.1.1生成静态库 7.1.2静态库使用 7.2 Linux下动态库 7.2.1 生成动态库 7.2.2 制作动态库 7.2.3 动态库的使 ...

  6. linux系统应用学习(三)--- 动态库静态库

    动态库静态库 库文件:一般指第三方提供的可调用的库函数文件,库文件封存的是函数体,即.c文件里面的内容. 动态库      静态库 Windows下:        xx.dll            ...

  7. Linux编程(5)_静态库与动态库

    1 库是什么 假如你写了一个perfect的项目, 有公司想要购买的你的源代码, 此时你肯定不想把你的源代码就这么给别人, 你只想让别人使用就够了. 那么你可以把的源代码生成为.o二进制文件, 封装成 ...

  8. 硬核拆解动态库静态库

    [Github pages] 动态库与静态库是编程中十分常见的玩意儿,但是如此常见的东西在我真正用心去了解梳理过一遍之后才发现原来这里面有这么多的门道.本文就介绍一波 Linux 平台下,特指 GCC ...

  9. c语言makecode头文件,cmake 添加头文件目录,链接动态、静态库

    罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目录INCLUDE_DIRECTORIES 语法: include_directories([AFTER| ...

  10. VS2015编译32位Opencv310(动态库+静态库,文末有下载链接)

    VS2015编译32位Opencv310(动态库+静态库 编译过得,可以直接用的: http://download.csdn.net/download/longzaihuaxia/9802510 之前 ...

最新文章

  1. Git_学习_06_ 放弃本地修改
  2. GO语言教程2:使用VS code进行go语言的编写和运行
  3. 这就是编程的终极难题? | 每日趣闻
  4. 概率论与数理统计(三)
  5. Effective Java第七条:避免使用终结方法
  6. 计算payload长度c语言,C语言0长度数组(可变数组/柔性数组)详解
  7. 信息学奥赛一本通(2028:【例4.14】百钱买百鸡)
  8. (转)基于MVC4+EasyUI的Web开发框架经验总结(4)--使用图表控件Highcharts
  9. link标签中的integrity和crossorigin字段---web前端工作笔记015
  10. Atitit SOW项目工作说明书 目录 1. SOW工作说明书(Statement of Work,简称SOW) 1 2. 项目工作范围 1 3. 工作期限和工作量估计 1 4. 交付成果(源码
  11. 超级好用论文写作工具NoteExpress下载和安装
  12. 与网友“阵春风”交流
  13. 多媒体计算机主要有哪些基本特性,多媒体计算机的基本特性
  14. 测试理论基础(重点)
  15. rabbitmq系列(三)消息幂等性处理
  16. 解题报告 (十) 单调栈
  17. SQL Server数据库的T-SQL查询语句
  18. Best Service Accordions 2 Kontakt 综合手风琴音色库
  19. RENIX报文字段跳变——网络测试仪实操
  20. 【Python黑科技】tkinter库实战“2048”小游戏(保姆级图文+实现代码)

热门文章

  1. web前端开发面试题(六)
  2. win10绝地求生游戏崩溃怎么解决
  3. 广义线性模型和线性回归
  4. java实现上传文件
  5. ps文件怎么导出html文件,PS存储到网页格式的最佳方式
  6. 计算机二级关于ppt背景音乐,计算机二级考试真题-PPT-校摄影社团优秀作品展
  7. HMS Core 3D精准室内定位技术,打造“店铺级”出行体验
  8. 巧得int(4字节)最大最小值
  9. 关于“Windows无法验证设备所需的驱动程序的数字签名”错误的解决方法
  10. html 媒体查询改变字体,CSS----媒体查询设置根节点字体大小