【其实很简单】C++实现静态连接

来源:互联网 发布:阿里云服务器域名解析 编辑:程序博客网 时间:2024/06/08 10:51

      最近在盛大在线从事IDW项目工作,提供的是面向盛大通行证的桌面客户端的登录认证解决方案,静态连接在在进行过程中被提及的一种接入方式,我们的首席程序工程师张中庆,不辞劳苦,加班加点,精心赶制出来。

      这里简单介绍一下基本原理和简单实现,目的在于技术交流。

 

 

一、静态连接和动态连接

      静态链接库是.lib格式的文件,一般在工程的设置界面加入工程中,程序编译时会把lib文件的代码加入你的程序中因此会增加代码大小,你的程序一运行lib代码强制被装入你程序的运行空间,不能手动移除lib代码。动态链接库是程序运行时动态装入内存的模块,格式*.dll,在程序运行时可以随意加载和移除,节省内存空间。

      在大型的软件项目中一般要实现很多功能,如果把所有单独的功能写成一个个lib文件的话,程序运行的时候要占用很大的内存空间,导致运行缓慢;但是如果将功能写成dll文件,就可以在用到该功能的时候调用功能对应的dll文件,不用这个功能时将dll文件移除内存,这样可以节省内存空间。

     但是静态连接的应用场景优势也非常明显,例如一些桌面程序,本身就是一个可执行程序文件(以便于版本的发布和管理),这个时候,动态连接就不适合了。

     静态链接很容易实现和使用,但是它有一些不是之处。 

   (1)版本发布关联性,如果构造一个可执行程序需要静态链接一些静态库,当静态库的版本升级时必须重新连接这些新的静态库来升级可执行程序。

   (2)资料耗费严重,通过静态链接产生可执行程序时,该可执行程序所依赖的静态库中的所有数据和代码都会被复制到可执行程序中,使得产生的可执行程序的体积比较庞大。更为浪费的是,某些常用的代码几乎会被每个可执行程序所包含。这不仅是浪费磁盘空间,而且当这些可执行程序被加载到内存执行时,会浪费宝贵的内存资源。

   (3)跨语言的调用困难,仅仅适合C/C++的内部调用,一旦涉及到和Delphi,c#,Java之间的调用,十分困难。

 

二、一个简单的静态连接实现案例

 

1、首先构建一个静态库的类库工程

 

 

类库工程创建完毕之后,本身还是动态连接库的方式,还需要手工修改一下,如下图:

点击确定,配置完成,开始写一些演示示例代码。

 

【顺便给CSDN提供一个意见:在Google Chrome浏览器下,博文编辑的页面的图片上传按钮不显示了,但是凭借着我的直觉,点击一下文件选择框旁边的区域,还是可以正常进行图片上传操作,呵呵,一个小bug,应该是浏览器css样式兼容的问题。】

 

     头文件,StaticDllLib.h,修改如下:

     定义了了一个类以及配套的构造函数和析构函数,另外定义了三个成员函数,add加函数、square平方函数和Max1一个找大函数。 另外,定义了一个非类内部函数,Max2一个找大函数。可以在客户端调用的时候,看看Max1和Max2的调用区别。

【弱弱的问:谁能告诉我有什么好办法可以贴代码么?】

 

 

 

     接下来,修改实现文件:StaticDllLib.cpp

类库代码部分差不多就结束了。F6,build工程,到解决方案下的debug目录下,看到一个文件StaticDllLib.lib,这就是连接库文件,加上刚才的头文件,库就生成了。

 

2、构建客户端调用的win32控制台工程

 

先修改工程属性:

(1),把StaticDllLibClient设置成先启动项目,set as Starup project.

(2)

(3)

(4)

 

(5)接下来就是修改调用客户端的源程序了

 

(6)运行一下试试

 

(7)完善一下调用代码,看看最终效果

 

采用传说中的动态内容分配技术,用类指针来实现,代码如下:

 

 

 

 

可以看出,max1和max2调用的区别。

 

纯属入门技术,有需要代码的朋友,可以发送邮件给我:jjkcom@sina.com