VC++静态连接库
目录
第1章静态连接库
静态连接库与动态连接库一样,都可以实现C++代码复用。与动态连接库相比,静态连接库最大的缺陷在于:如果某个相同的函数名在多个静态库里重复出现,那么连接这个函数时选择哪个库就显得尤为重要。稍有不慎,就可能出现大问题。不过,静态库也有它的优势:可以只生成单独的一个 exe 执行文件,发布起来会比较方便。
1.1 同名函数的选择
以下图为例,假定有两个静态库Lib1、Lib2,这两个库里均包含了函数func。如果客户程序Test用到了func函数,那么连接Test程序时编译器到底选择哪个库里的func呢?

经过VC++6.0的测试发现:这与Lib1、Lib2的连接顺序有关:先连接Lib1,就使用Lib1中的func;同样的,先连接Lib2,就使用Lib2中的func。
假如Test用到了func和func2,连接库的顺序是 Lib1、Lib2。会出现什么情况呢?先连接Lib1,因为func函数的缘故,模块1.obj将参与连接。连接Lib2时,func的连接将继续使用1.obj,func2的连接则必须使用模块2.obj。但是1.obj和2.obj有func的冲突,编译器(VC++6.0)会提示如下错误:
Lib2.lib(2.obj) : error LNK2005: "void __cdecl func(void)" (?func@@YAXXZ) already defined in Lib1.lib(1.obj)
就是说:连接器在使用2.obj时,发现了与1.obj的同名函数func,连接无法继续下去,报错终止连接过程。
此时,该如何处理呢?答案就是改变连接库的顺序。下图就是修改Test项目的连接库顺序,先连接Lib2,再连接Lib1。

改变顺序后,func和func2均使用2.obj连接。1.obj不再起任何作用。
如果Test同时使用func1、func2、func函数,问题就很麻烦了。一种可行的解决方案就是:把1.obj和2.obj里的func函数封装到两个动态连接库里。
1.2 模块合并
可以把一个库文件里的obj模块嵌入到另一个库文件内。举例说明:
假定Lib1工程只有一个源文件1.cpp,Lib2工程只有一个源文件2.cpp。则生成的Lib1.lib和Lib2.lib结构如下图所示:

现在,设置Lib2依赖于Lib1,如下图所示:

重新编译Lib2,此时Lib2.lib结构如下图所示。

可见:Lib1的模块被合并至Lib2内。
1.2.1 模块替换
假定Lib1、Lib2工程都只有一个源文件1.cpp。Lib2依赖于Lib1,则编译Lib2生成的Lib2.lib中,1.obj是Lib1的,还是Lib2的?经过试验得知:这个1.obj是Lib2工程里的。生成顺序:首先把Lib1.lib里的模块全部加入Lib2.lib中,接着编译Lib2中的源文件,最后将生成的obj加入Lib2.lib中,如果有同名的obj则替换掉。
1.3 内联函数
假定Static.lib里有函数int Test()的代码如下:
|
int Test() { return 0; } |
客户端程序使用Test函数的代码如下:
|
#define USE_INLINE 1 #if USE_INLINE inline int Test() { return 1; } #else int Test(); #endif #pragma comment(lib,"Static.lib") void main() { int n = Test(); } |
当USE_INLINE非零时,n将是1。也就是说main调用了内联函数Test;
当USE_INLINE为零时,n将是0。也就是说main调用了Static.lib里的Test函数(非内联函数)。
VC++静态连接库的更多相关文章
- Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库 本文地址:https ...
- make文件中静态连接库在command里面的位置
linux软件第一次调用动态连接库的时候要延迟几秒,怀疑在突然掉库的时候动态库加载耗费了时间,所以造成延时,遂改为静态库方式,原来的makefile文件是 testmac: cp $( ...
- windows 查看动态连接库和静态连接库的方法
在window下查看动态库的导出函数可以用vs自带的Dependenc工具: 查看静态库的信息要用命令行来实现: dumpbin /LINKERMEMBER Test.lib > ...
- 制作与使用静态链接库(.lib)文件
(一)制作.lib文件 (1)打开vs,选择“新建项目”,选择“Visual C++“,选择”Win32 控制台应用程序“. (2)点击”确定“,点击”下一步“,设置如下 (3)点击”完成“,然后就可 ...
- [转载]GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结
来自http://blog.csdn.net/benpaobagzb/article/details/51364005 GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有 ...
- (C#)WPF:.h(头文件)、.lib(静态链接库文件)和.dll(动态链接库文件)之间的区别与联系
静态链接库(Lib)与动态链接库(DLL)的区别 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件:动态链接就是把调用的函数所在文件模块(DLL)和 ...
- VC win32 static library静态链接库简单示例
中午在宿舍闲来没事,看到网上一篇帖子,关于静态链接库的英文示例.它在.Net上开发,我将其移到VC上开发,因此对其代码做了相应修改.帖子内容如下:(代码我已修改).原帖见:http://msdn.mi ...
- vc下的静态链接库与动态链接库(一)
一.静态库与动态库的区别 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Lib ...
- Linux 静态链接库和动态连接库
(0)文件夹 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 Linux ...
随机推荐
- 马蜂窝ABTest多层分流系统的设计与实现
什么是 ABTest 产品的改变不是由我们随便「拍脑袋」得出,而是需要由实际的数据驱动,让用户的反馈来指导我们如何更好地改善服务.正如马蜂窝 CEO 陈罡在接受专访时所说:「有些东西是需要 Sen ...
- LCA rmq st model
LCA:倍增 memset(p,-,sizeof(p)); inline void dfs(int u) { ;i=e[i].next) { int v=e[i].v; ) { deep[v]=dee ...
- MFC中的双缓冲技术(解决绘图闪烁问题)
转自 MFC绘图不闪烁——双缓冲技术[转] 在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃. 所谓双缓冲技术,下面是百度百科的 ...
- Java抓屏程序代码
原文:http://www.open-open.com/code/view/1422262655200 import java.awt.Dimension; import java.awt.Recta ...
- js上传文件研究
https://github.com/shengulong/javascript-file-upload
- flask可以通过缓存模板或者页面达到性能提升
flask可通过插件flask-cache缓存页面,或者把模板缓存到memcache里,增加访问速度. 前提是:页面不是频繁变化的.如果你的访问量很大的话,哪怕缓存一两分钟也会大大的提高性能的 Fla ...
- 阿里云OSS 图片处理api(custom)
阿里云OSS 图片处理api(custom) 阿里云对象存储服务(Object Storage Service, 简称OSS) 学习了:https://blog.csdn.net/u014559227 ...
- [Cypress] install, configure, and script Cypress for JavaScript web applications -- part3
Use custom Cypress command for reusable assertions We’re duplicating quite a few commands between th ...
- PS 如何使用液化工具给人物减肥
进入"液化", 有个收缩按钮, 可以选择范围大小, 想瘦哪里, 瘦多少都OK 最终效果图 1.打开原图,进入通道面板,选择菜单图像计算,计算红色通道,保留人物见图. ...
- ubuntu 16.04 更新后搜狗输入法无法输入中文的问题
方法一:重启搜狗输入法 通过下面的两个命令重启搜狗输入法,看重启后是否可以正常使用: ~$ killall fcitx ~$ killall sogou-qinpanel 方法二:检查修复安装依 ...