Linux 下动态库 / 静态库(依赖)
一、 依赖动态库的动态库
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 下动态库 / 静态库(依赖)的更多相关文章
- linux下的制作静态库并使用它
静态库所要用的源文件 文件 fred.c #include <stdio.h> void fred(int argc) { printf("void fred(i ...
- 使用CMake在Linux下编译tinyxml静态库
环境:CentOS6.6+tinyxml_2_6_21.下载并解压tinyxml_2_6_2.zip unzip tinyxml_2_6_2.zip 2.在tinyxml文件夹里创建一个CMakeLi ...
- 谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH
谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH 转载自:http://blog.chinaunix.net/xmlrpc.ph ...
- linux中C的静态库和动态库分析
从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...
- Linux下动态库生成和使用
Linux下动态库生成和使用 一.动态库的基本概念 1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态链接库是目标文件的集合,目标文件在动态链接库中 ...
- linux 动态库 静态库 函数覆盖
本文讨论了linux动态库 静态库中函数的覆盖问题. 测试目的: 同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另 ...
- Linux 动态库 静态库
什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和Linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的库函数分为静态库和动态库 ...
- 【转】Linux编译链接问题----静态库和动态库
Linux静态库和动态库的命名规则 静态函数库 静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中. a) 优点: 编译后,可执行文件不 ...
- 深入理解LINUX下动态库链接器/加载器ld-linux.so.2
[ld-linux-x86-64.so.2] 最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜 ...
随机推荐
- DP(优化) UVALive 6073 Math Magic
/************************************************ * Author :Running_Time * Created Time :2015/10/28 ...
- POJ1780 Code(欧拉路径)
n位密码,要用尽可能短的序列将n位密码的10n种状态的子串都包括,那么要尽量地重合. 题目已经说最短的是10n + n - 1,即每一个状态的后n-1位都和序列中后一个状态的前n-1位重合. 这题是经 ...
- 基于Extjs的web表单设计器 第五节——数据库设计
这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...
- CentOS6.4 配置Tengine
1.安装Nginx所需的pcre-devel库 yum install -y gcc gcc-c++ wget ftp://ftp.csx.cam.ac.uk/pub/software/program ...
- COJ967 WZJ的数据结构(负三十三)
WZJ的数据结构(负三十三) 难度级别:C: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...
- NOIP200107统计单词个数
NOIP200107统计单词个数 难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给出一个长度不超过200的由 ...
- JS中的闭包的一些理解!
在日常的开发中,基本上是不会遇到关于闭包的这样,但是,因为在一些特殊的情况下,必须采用闭包,所以这里简单的概述下什么是闭包: OK!简而言之,闭包只是一个名词而已,我们更注重于他所实现的功能,也就是我 ...
- float塌陷有关问题
程序代码需要用到的CSS样式body{ margin:0px; padding:0px; text-align:center; font:Arial, Helvetica, sans-serif; f ...
- 通过程序校验xml文档学习笔记
校验xml文档,可以通过程序来校验,利用一段js代码即可. 各行代码的含义已经写出,运行这个html文件,检验如下xml代码: 结果如下: 如果xml文档出现错误: 结果如下: 其中,obj.asyn ...
- [转].net自定义configSections的5个示例
本文转自:http://www.yongfa365.com/item/configuration-configSections-SingleTagSectionHandler-DictionarySe ...