目录

第1章静态连接库    1

1.1 同名函数的选择    1

1.2 模块合并    2

1.2.1 模块替换    4

1.3 内联函数    4

第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++静态连接库的更多相关文章

  1. Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库     本文地址:https ...

  2. make文件中静态连接库在command里面的位置

    linux软件第一次调用动态连接库的时候要延迟几秒,怀疑在突然掉库的时候动态库加载耗费了时间,所以造成延时,遂改为静态库方式,原来的makefile文件是 testmac:         cp $( ...

  3. windows 查看动态连接库和静态连接库的方法

    在window下查看动态库的导出函数可以用vs自带的Dependenc工具: 查看静态库的信息要用命令行来实现: dumpbin   /LINKERMEMBER   Test.lib   >   ...

  4. 制作与使用静态链接库(.lib)文件

    (一)制作.lib文件 (1)打开vs,选择“新建项目”,选择“Visual C++“,选择”Win32 控制台应用程序“. (2)点击”确定“,点击”下一步“,设置如下 (3)点击”完成“,然后就可 ...

  5. [转载]GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

    来自http://blog.csdn.net/benpaobagzb/article/details/51364005 GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有 ...

  6. (C#)WPF:.h(头文件)、.lib(静态链接库文件)和.dll(动态链接库文件)之间的区别与联系

    静态链接库(Lib)与动态链接库(DLL)的区别 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件:动态链接就是把调用的函数所在文件模块(DLL)和 ...

  7. VC win32 static library静态链接库简单示例

    中午在宿舍闲来没事,看到网上一篇帖子,关于静态链接库的英文示例.它在.Net上开发,我将其移到VC上开发,因此对其代码做了相应修改.帖子内容如下:(代码我已修改).原帖见:http://msdn.mi ...

  8. vc下的静态链接库与动态链接库(一)

    一.静态库与动态库的区别 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Lib ...

  9. Linux 静态链接库和动态连接库

    (0)文件夹 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 Linux ...

随机推荐

  1. 清除svn检出导致的所有文件的问号

    问题:将svn项目检出到桌面后,桌面的图标都有问号了,怎么消除这一大堆问号? 解决方案:(1)新建一个a.txt文件,把这行代码复制进去for /r . %%a in (.) do @if exist ...

  2. CSV文件导出2

    public void exportCSVFile( HttpServletResponse response, ResultSet rs,String fileName,String headers ...

  3. VirtualBox 5.0.10 中 Fedora 23 在安装了增强工具后无法自动调节虚拟机分辨率的问题(改)

    VirtualBox 5.0.10 中安装 Fedora 23,即使在安装了增强工具后,仍然会发现虚拟机无法根据 VirtualBox 的运行窗口大小自动进行分辨率调节.究其原因,主要是因为 Fedo ...

  4. 牛客练习赛1 矩阵 字符串二维hash+二分

    题目 https://ac.nowcoder.com/acm/contest/2?&headNav=www#question 解析 我们对矩阵进行二维hash,所以每个子矩阵都有一个额hash ...

  5. Java Enum枚举的用法(转)

    说明:Java的枚举比dotnet的枚举好用,至少支持的方式有很多. 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以 ...

  6. Nginx负载均衡配置实例(转)

    1.轮询 轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器.配置的例子如下: http{ upstream sampleapp { serv ...

  7. Go -- type 和断言 interface{}转换

    摘要 类型转换在程序设计中都是不可避免的问题.当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关 注这方面的问题.但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编 ...

  8. printf行缓冲区的分析总结

    最近在客户那调试串口的时候,read串口然后printf打印,单字符printf,发现没有输出,后来想起来printf这些标准输入输出函数也是属于标准C库glibc的, 这里就要区分一下标准库函数和系 ...

  9. BUPT复试专题—中位数(2014-2)

    题目描述 给定一个长度为N的非降数列,求数列的中位数.中位数:当数列的项数N为奇数吋,处于中间位置的变最值即为中位数:当N 为偶数时,中位数则为处于中间位置的两个数的平均数.   输入 输入数据第一行 ...

  10. Error: cannot call methods on draggable prior to initialization; attempted to call

    cannot call methods on draggable prior to initialization; attempted to call  报这个问题的根本原因是由于你的引用文件有问题 ...