C++高级编程2. 静态动态链接库20131018

1.动态链接库和静态链接库的区别:

静态链接库就是把lib文件中用到的函数代码直接连接进目标程序,程序运行的时候不在需要其他的库文件;动态链接库是把调用的函数所在文件模块(对应的DLL)和调用函数在文件中的文职等信息链接进目标程序,程序运行的时候再从DLL中寻找相应的函数代码,因此需要响应DLL文件的支持。

静态链接库和动态链接库都是采用共享代码的方式,如果采用静态连接,无论我们愿不愿意,lib中的指令都全部被包含在最终生成的EXE文件中。但是如果我们使用动态链接库DLL的话,改DLL文件不包含在最终的EXE文件中,而是单独的一些文件,和EXE一起发布,EXE文件执行的时候,会东热爱的引用和卸载这些和EXE独立的DLL文件。同时静态链接库中不能够在包含其他的动态或是静态的链接库,但是DLL中是还可以包含其他的动态或者是静态的链接库。

每一个lib文件就是若干个函数的定义,lib库有两种,一种是包含了函数所在DLL文件和文件中函数位置信息,称之为导出库;一种是包含函数代码本身,一般现有的DLL,用的是前一种库。

使用静态库比较简单,我们将函数作为一个extern  “C ” 编译生成响应的lib文件,然后再另一个工程中,#include 头文件,就可以使用使用了,在编译过程中,会将器提阿尼啊到最终的exe执行文件中;

2.我们看一下创建动态链接库的例子。

首先是看如何创建DLL,一般会按照C方式的编译而不是C++的链接方式。

2.1创建DLL:新建解决方案和项目的时候,创建的是DLL项目而不是控制台,这样的话,最终编译生成的是DLL文件。创建完成空项目之后,创建两个文件一个是头文件(MathFuncs.h)这个头文件是声明函数的形式,到时候提供给使用者。

头文件声明的形式:

//MathFuncsDll.h

#define MATH_FUNCS_API __declspec(dllexport)

extern "C" {

int MATH_FUNCS_API add(int a, int b);

int MATH_FUNCS_API add(int a, int b);

}

这样表示对外的函数的形式 其中定义了一个,表示的是方式export导出函数的形式。然后在对应的CPP文件中实现对应的声明形式。

//MathFuncsDll.cpp

#include <iostream>

#include "MathFuncsDll.h"

using namespace std;

int add(int a, int b){

cout << "in dll add function" << endl;

return a+b;

}

int sub(int a, int b){

cout << "in dll sub function" <<endl;

return a-b;

}

这样就编译就完成了对外输出的函数的DLL创建。

在看一下应用程序,应用程序使用DLL有两种方式,一种是使用.h 头文件,然后直接调用其中的函数使用,但这种方式在程序一开始的时候就需要将所有的DLL全部加载到内存,占用了大量的资源;虽然比较直接,但是浪费了空间和效率。

在 应用程序中调用使用的是

MathFuncsDll.h

#define MATH_FUNCS_API __declspec(dllexport)

extern "C" {

int MATH_FUNCS_API  add(int a, int b);

int MATH_FUNCS_API  sub(int a, int b);

}

在程序中直接include 该头文件即可使用器对应的函数,在程序需要的时候,跳转到DLL中的地址执行。

另外一种方式就是使用动态加载DLL的方式:

不需要使用头文件,只要知道其函数的名字和参数类型,使用Windows.h中的动态加载。

这一种方式更加常用,而且更加高端大气上档次,不过在VS中需要将项目的属性中的字符集设置成为更多的字符而不是Unicode字符集

int a = 9, b= 3;

HINSTANCE hInstance = LoadLibrary("MathFuncsDll.dll");

if(hInstance != NULL){

cout << "success load dll " << endl;

Func add = (Func) GetProcAddress(hInstance,"add");

if(add != NULL){

cout << add(a,b) << endl;

}

Func sub = (Func) GetProcAddress(hInstance,"sub");

if(sub != NULL){

cout << sub(a,b) << endl;

}

}else{

cout << "load dll failed" << endl;

}

if(hInstance != NULL){

FreeLibrary(hInstance);

cout << "free dll " << endl;

}

在看一下下静态库的加载和调用,因为静态库是需要链接形成二进制文件的,所以exe的会比较大,发布的时候,直接将exe发布即可,而不用dll

静态库提供给别人使用的时候,应该有头文件,下面讲解一个例子

创建一个解决方案,然后添加一个项目,是静态库的形式,是空项目,添加一个头文件和一个cpp文件:

//sub.h

extern "C" {

int  sub(int a, int b);

}

//sub.cpp

实现函数

在创建一个项目添加进解决方案

创建一个main.cpp

将该项目设置成为启动项目,并且添加引用的关系,(必须添加引用关系,否则报错);

在cpp中

#include <iostream>

#include "../sub/sub.h"

using namespace std;

int main(){

cout << sub(12,9) << endl;

return 0;

}

C++高级编程2. 静态动态链接库的更多相关文章

  1. C 高级编程3 静态库与动态库

    http://blog.csdn.net/Lux_Veritas/article/details/11934083http://www.cnblogs.com/catch/p/3857964.html ...

  2. Win32编程之静态库编写与使用.动态链接库的编写与使用

    Win32编程之静态库编写与使用.动态链接库的编写与使用 一丶什么是静态库.什么是动态链接库. 静态库其实就是解决模块开发的一种解决方案.在以前.我们写代码的时候.每个人都可以独立写一个项目.但是现在 ...

  3. 《C#高级编程》读书笔记

    <C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) sh ...

  4. UNIX环境高级编程---标准I/O库

    前言:我想大家学习C语言接触过的第一个函数应该是printf,但是我们真正理解它了吗?最近看Linux以及网络编程这块,我觉得I/O这块很难理解.以前从来没认识到Unix I/O和C标准库I/O函数压 ...

  5. OC高级编程——深入block,如何捕获变量,如何存储在堆上

    OC高级编程——深入block,如何捕获变量,如何存储在堆上   首先先看几道block相关的题目 这是一篇比较长的  博文 ,前部分是block的测试题目,中间是block的语法.特性,block讲 ...

  6. python高级编程之我不测试

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#测试驱动开发(高级编程处学习,第11章)#测试驱动开发也叫TDD, 是制造高质量软件的一种简单技 ...

  7. 《Hadoop》对于高级编程Hadoop实现构建企业级安全解决方案

    本章小结 ●    理解企业级应用的安全顾虑 ●    理解Hadoop尚未为企业级应用提供的安全机制 ●    考察用于构建企业级安全解决方式的方法 第10章讨论了Hadoop安全性以及Hadoop ...

  8. C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)),不对的地方欢迎指出与交流. 章节出自<Professional C ...

  9. C# 6 与 .NET Core 1.0 高级编程 - 40 ASP.NET Core(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 40 章  ASP.NET Core(上)),不对的地方欢迎指出与交流. 章节出自<Professiona ...

随机推荐

  1. HYSBZ - 2818 Gcd (莫比乌斯反演)

    莫比乌斯反演的入门题,设 \(F(x): gcd(i,j)\%x=0\) 的对数,\(f(x): gcd(i,j)=x\)的对数. 易知\[F(p) = \lfloor \frac{n}{p} \rf ...

  2. (译)Windows Azure:移动后端开发的主要更新

    Windows Azure:移动后端开发的主要更新 这周我们给Windows Azure释出了一些很棒的更新,让云上的移动应用开发明显的简单了.这 些新功能包括: 移动服务:定制API支持移动服务:G ...

  3. 《Unity3D》通过对象池模式,管理场景中的元素

    池管理类有啥用? 在游戏场景中,我们有时候会需要复用一些游戏物体,比如常见的子弹.子弹碰撞类,某些情况下,怪物也可以使用池管理,UI部分比如:血条.文字等等 这些元素共同的特性是:存在固定生命周期,使 ...

  4. XSS是什么

    1.XSS是跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS. 2.恶意攻击 ...

  5. maven项目报Failed to read artifact descriptor

    公司私服是个垃圾,处理自定义的jar包外,没有提供到中央仓库的路由,以至于通过maven下载jar包是老是报错. 折腾好久,最后在maven的update project时勾选了force updat ...

  6. Windows Update error 80070003

    上次更新完成一半,这次更新便会出错.办法:删除上次更新残余文件. 删除Windows 用于标识计算机更新的临时文件.需要先停止Windows Update 服务: 在开始菜单的“搜索程序和文件”框输入 ...

  7. Asp.net Core Windows部署

    一.  IIS 部署模式 1. 安装IIS服务 2. 下载安装Core SDK        https://www.microsoft.com/net/download/Windows/build3 ...

  8. 解决Android Studio中Rendering Problems错误

    android studio提示错误信息如下图: 解决办法: 打开styles.xml文件 在Theme.AppCompat.Light.DarkActionBar前面加上Base. 修改后解决错误:

  9. mysql对数据库的备份和还原

    在对mysql数据库的某个数据库进行备份时,使用 mysqldump命令来进行操作 mysqldump -u root -p db_database_name > /[your_path.mys ...

  10. webservice获取天气信息

    效果 1.eclipse中新建一个Java项目 2.通过命名获取天气的客户端信息 首先,打开天气网站http://ws.webxml.com.cn/WebServices/WeatherWS.asmx ...