vc的静态库依赖

原创 2016年08月31日 09:18:48

@(技术博客)

vc的静态库依赖

背景

vc编译的静态库.lib文件是一系列.obj文件的集合,这点和linux系统上的静态库一致,但是vc的静态库有一个独有的功能,强制这个静态库的使用者必须链接某个库。这点在静态库已经有很复杂的依赖关系或者需要强制链接某个版本的库时及其有用。
否则,如果静态库中用到了其他的库,需要这个静态库的使用者在最终的链接阶段清楚所有使用到的库,然后一一链接。
如果静态库依赖的库很多的话,而且依赖的关系很复杂,那么对于最终的使用者来说绝对是一场噩梦。
在linux下,我们可以将所有依赖的库全部解压 再打包到一个库中实现,但是这个方法还有一些问题,而且操作也比较麻烦。具体内容我在另一篇博客中已经详细描述了,这里不再赘述。
但是VC编译器却可以毫无副作用的完美实现这个功能,并不增大库的体积,而且也可以链接动态库,这到底怎么实现的呢?

有两种方法可以做到这一点:

DEFAULTLIB

vc的链接器有一个参数/DEFAULTLIB:library ,可以将library 添加到 LINK 在解析引用时搜索的库列表(这是官方翻译),其实意思就是指会强制这个库的使用者链接某个库。
这个参数只能在使用命令行的时候使用,vs界面中没有任何一个地方可以设置这个选项。

依赖

vs的静态库项目设置页里有一个库管理器的东西,里面可以设置要链接的库,但是其实就是将所有的库解开后再全部打包,和linux上的方案一样,会造成库的体积剧烈膨胀,我们通常并不会用这种方法。

pragma comment(lib, “xxx.lib”)

在代码中插入这个选项可以自动链接一个库,免去在vs的项目配置中指定链接的库。但是如果此项目是一个静态库,他就会和使用DEFAULTLIB的效果一样了。考虑到大多数人应该不是使用命令行来编译,所以这应该是大多数人使用的方法。

原理

但是实现这个功能的原理是什么呢?为什么linux实现不了呢?
这就要提到vc编译的一些细节了。众所周知,vc编译后的obj目标文件是一种coff文件,而coff文件是分段的。其中vc链接器规定了一个特殊的段.drectve,这个段内容是编译器传递给链接器的指令。而vc的静态库依赖就是靠这个实现的。/DEFAULTLIB选项和pragma comment都会将库信息写在这个段里。然后库的使用者在链接的时候自然就会读取到这个信息然后自动链接。
也就是说这个信息是写在obj目标文件里的,并不是写在.lib静态库文件里的。

查看

那么怎么查看指定链接了哪些库呢?有以下的方法:
- 使用vc提供的查看工具dumpbin /DIRECTIVES查看.lib或者objdrectve信息,但是release版会隐藏这些信息,不一定能看到。
- 直接以文本模式打开.lib或者obj文件,搜索.lib字符,就可以找到相应的信息。这个方法在release版下也能使用.

版权声明:本文为博主原创文章,未经博主允许不得转载。

VC++ 项目怎样添加“依赖”、“库目录”和“包含目录”

VC++ 项目怎样添加“依赖”、“库目录”和“包含目录”  1. 添加编译所需要(依赖)的 lib 文件 [解决方案资源管理器]“项目->属性->配置属性->连接器->输入->...

vc链接静态库的时候要注意的问题

 vc工程与被链接的静态库(*.lib)文件之间要保持一致: 例如:  是共享模式使用MFC dll还是静态模式使用MFC dll? 是多线程还是单线程? 是调试模...

linux下的静态库依赖

linux下的静态库依赖背景linux的静态库.a和动态库.so的区别很大,静态库基本上只是一系列.o文件的集合加上符号表,没有链接过程,不能依赖链接其他的静态库或者动态库。如果静态库中用到了其他的库...
  • bjrxyz
  • bjrxyz
  • 2016年08月29日 20:21
  • 2027

静态链接库相互依赖

想同时链接两个自定义的静态链接库,发现无论以什么顺序链接都会有一些函数未定义。网上搜了一番找到解决方案: 假设有liba.a和libb.a两个静态链接库,则添加链接选项时,多链接其中一个库一遍即可解...

VC2010编译的libiconv静态库

  • 2015年10月29日 17:11
  • 599KB
  • 下载

vc2008构建和使用libcurl静态库

1>下载CURL源代码curl-7.26.0.zip  2>用VC2008/2005打开工程curl-7.26.0\lib\libcurl.vcproj,转换下工程并构建,可以直接编译成功! ...

CodeBlocks与C-Free使用VC的静态库

CodeBlocks与C_Free在使用GNU GCC 编译器时统一使用的是linux的格式即为.a格式,而VC使用的为.lib格式,找了这方面的相关资料在 gcc g++ 怎样调用vc的 .lib库...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc的静态库依赖
举报原因:
原因补充:

(最多只允许输入30个字)