一、 依赖动态库的动态库

libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而main.exe又调用了libfun.so的函数int nothing()。

下面两种方式都能工作:

1> 常用的方式

g++ -shared -fPIC -o libtest.so test.cpp

g++ -shared -fPIC -o libfun.so function.cpp  -L./ -I./ -ltest ---这里ldd能看到libfun.so依赖libtest.so(用ldd时可能要先在libfun.so所在目录执行下export LD_LIBRARY_PATH=./)

g++ -o main.exe main.cpp -L./ -I./ -lfun    ---编译libfun.so的时候已经指定了依赖libtest.so,这里就不需要再指定了

或者

2>不常用的方式

g++ -shared -fPIC -olibtest.so test.cpp

g++ -shared -fPIC -o libfun.so function.cpp    ---这里ldd可知,libfun.so没有依赖libtest.so

g++ -o main.exe main.cpp -L./ -I./ -lfun -ltest ---因为编译libfun.so的时候没有指定它依赖libtest.so,所以要加上-ltest

从2>可知,linux下面生成动态库的时候,即使动态库里有没有定义的函数,在编译链接的时候,默认不会提示错误,是能通过的。

但是,当可执行文件在链接这个有未定义函数的动态库的时候则会报错。具体解释可通过man ld查看说明。

经过测试发现,无论是在静态库或是动态库中,都可以只声明一个函数而不定义此函数,但是在库中可以调用此未定义的函数,生成库的时候都能成功;原来一直以为只有静态库才能这样用,因为静态库生成的时候是不需要链接的。现在才知道,动态库静态也能这样用。

二、依赖动态库 / 静态库的动态态库 / 静态库

静态库只是一堆object对象的集合,使用ar命令可以将编译产生的.o文件打包成.a静态库。

生成静态库只有编译,而没有链接;而动态库在生成的时候时既有编译的动作也有链接的动作。

静态库在被别的程序(可执行程序或是动态库)链接的时候,链接器会将程序中使用到函数的代码从静态库文件中拷贝到应用程序中的。

静态库生成时是没有链接的,所以生成它的时候不需要指定它所依赖的外部库;动态库生成时是有链接动作的,那当然就要指定它依赖哪些外部库了。

如:

$ gcc -c libhello -o libhello.o
$ ar rcs libhello.a libhello.o

这里先编译得到.o文件,然后再用ar命令打包即得到了静态库,它是没有链接动作的。

如一中所述,如果一个动态库依赖一个动态库,则该动态库是会知道它所依赖的动态库的。那么,如果一个动态库依赖一个静态库呢?这时,在生成这个动态库时,它就会将静态库的代码拷贝到动态库程序中的。例如, liba.so 依赖 libb.a, 则在生成liba.so时必须要在makefile中指定依赖静态库libb.a,且要指定libb.a为查找目录。同时如果可执行程序c.out依赖liba.so,则a.out只需要指出它依赖动态库liba.so就可以了,a.out不需要再去链接静态库libb.a了。

还有,一个静态库依赖一个静态库 / 动态库呢? 因为如上所述,生成静态库的时候它是没有链接动作的,所以不需要指定它所依赖的外部静态库或是动态库。所以,只要在链接静态库的地方再去指定链接该静态库的依赖库就可以了。

Linux 下动态库 / 静态库(依赖)的更多相关文章

  1. linux下的制作静态库并使用它

    静态库所要用的源文件 文件 fred.c   #include <stdio.h>   void fred(int argc) {     printf("void fred(i ...

  2. 使用CMake在Linux下编译tinyxml静态库

    环境:CentOS6.6+tinyxml_2_6_21.下载并解压tinyxml_2_6_2.zip unzip tinyxml_2_6_2.zip 2.在tinyxml文件夹里创建一个CMakeLi ...

  3. 谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH

    谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH  PKG_CONFIG_PATH 转载自:http://blog.chinaunix.net/xmlrpc.ph ...

  4. linux中C的静态库和动态库分析

    从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...

  5. Linux下动态库生成和使用

    Linux下动态库生成和使用 一.动态库的基本概念 1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态链接库是目标文件的集合,目标文件在动态链接库中 ...

  6. linux 动态库 静态库 函数覆盖

    本文讨论了linux动态库  静态库中函数的覆盖问题. 测试目的: 同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另 ...

  7. Linux 动态库 静态库

    什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和Linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的库函数分为静态库和动态库 ...

  8. 【转】Linux编译链接问题----静态库和动态库

    Linux静态库和动态库的命名规则 静态函数库 静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中. a) 优点: 编译后,可执行文件不 ...

  9. 深入理解LINUX下动态库链接器/加载器ld-linux.so.2

    [ld-linux-x86-64.so.2] 最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜 ...

随机推荐

  1. Win7系统删除微软拼音

    微软拼音会在使用Office时偷偷的安装,都找不到删除的地方.在网上找了很多方法都不灵光,最后用下面的方法成功删除.   在语言设置窗口里,重新添加一次这个输入法,确定保存,然后再删除,就行了. 这个 ...

  2. kmp 和boyer-moore

    <html> <head> <meta http-equiv="content-type" content="text/html; char ...

  3. BZOJ4013 : [HNOI2015]实验比较

    首先用并查集将等号缩点,然后拓扑排序判断有没有环,有环则无解,否则通过增加超级源点$0$,可以得到一棵树. 设$f[x][y]$表示$x$子树里有$y$种不同的数字的方案数,由底向上DP. 对于当前点 ...

  4. TYVJ P1047 乘积最大 Label:dp

    背景 NOIP 2000 普及组 第三道 描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力 ...

  5. BZOJ3772: 精神污染

    Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...

  6. 提升 web 应用程序的性能(一)

       提升 web 应用程序的性能,找出瓶颈,加快客户端内容的速度.    作为 web 用户,我们知道页面加载或刷新的速度对其成功至关重要.本文将帮助您更好地理解影响 web 应用程序性能的因素.学 ...

  7. QImage Color Convert to Gray 转为灰度图

    在Qt中,我们有时需要把QImage类的彩色图片转为灰度图,一开始我想的是用QImage的成员函数convertToFormat(),但是试了好多参数,返现转化的图片都有问题,不是我们想要的灰度图,如 ...

  8. MySQL 5.7在线设置复制过滤

    很久没有更新博客了,主要是公司事情比较多,最近终于闲下来了.然而5.7也GA了,有许多新的特性,其中现在可以进行在线设置复制过滤了.但是还是得停复制,不过不用重启实例了.方便了DBA们进行临时性的调整 ...

  9. HDU 1754 I Hate It(线段树单点更新区间最值查询)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. Windows编译安装OpenSSL

    windows下使用vs2008中的nmake编译安装openssl的脚本build.bat: echo off & color 0A :: 项目名称 set PROJECT=openssl ...