1. 首先,如何制作一个静态库(lib)?

额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件。之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去手动打包到我们的可执行文件当中。我们知道,打包一个文件,里面的东西非常之多,当我们加载时,内存会被很多的代码块锁占用,因而常常有一种,调用一个函数,而不得不去读取一大片的代码块儿的感觉。这就是静态库的缺点没有之一

就像写一个这样的程序:

 #include<stdio.h>
#include<string.h>
#include<windows.h> void msg(char text[] ){
MessageBox(, text, "title", );
} int _max(int a , int b) { return a > b ? a : b;
}

然后 将vs点击属性 --> 常规 -->Configuration Type 将Application (.exe) 改为Static library (.lib)就好了!  然后编译即可!

生成之后,将该lib文件放置于我们项目的目录中。在头文件初,#prama comment(lib,"cof.lib");即可!

然后调用代码如下:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h> #pragma comment(lib,"staticlib.lib") //引入一个静态库 int main(int argv ,char args []){ meg("你好!");
printf("%d\n",_max(,));
getchar();
return ;
}

2。 而动态库的使用,则刚好避免了静态库这一个庞大而强占大量内存的缺点,它封装了每一个函数,作为一个接口,当我们需要哪个的时候,就可以读取哪个函数的代码到内存块中,占用的内存相对的小很多。那么如何生成一个dll呢?

关于动态库的生成方式和lib差不离,将属性改为 将Application (.exe) 改为 dll即可

不过在定义函数时需要在前面加载:  declspec(dllexport)

代码如下:

 #include<stdio.h>
#include<string.h>
#include<windows.h> _declspec(dllexport) void msg(char text[] ){
MessageBox(, text, "title", );
} _declspec(dllexport) int _max(int a , int b) { return a > b ? a : b;
}

那么生成了dll之后,如何来调用这个dll呢? 调用dll没有像静态库那么简单的用一个宏命令就可以使用了,相反这个过程还是稍稍的繁琐了一些。

首先,我们需要定义一些函数指针,来指向这些dll函数地址。 如下面的代码:

 #include<stdio.h>
#include<stdlib.h>
#include<windows.h> //定义一个函数指针类型
typedef void(*pmeg)(char []); //指向meg的一个指针
//定义一个函数指针类型
typedef int(*pmax) (int ,int ); //定义一个指向_max的指针 int main(int argv ,int args[]){ //定义了指针之后,我们需要使用widow API 来HMoDULE来定义一个模块
HMODULE mdll;
mdll = LoadLibraryA("dongdll.dll"); //加载dll文件,需要带路径
if (NULL == mdll) {
printf("dll加载失败");
return ;
}
else{
pmeg mymeg;
mymeg = (pmeg )GetProcAddress(mdll,"msg");
if (mymeg != NULL) {
mymeg("nihao");
}
else {
printf("没有相关函数! msg");
}
}
getchar();
return ;
}

但是,对于平时我们平时为什么可以直接注入dll到相应的执行文件中呢?  是因为我们覆盖了我们执行文件的那块儿内存,所以在能够去run,我们给他加载的函数。

以上就是对于静态库和动态库的生成和调用的方法。

对于静态库和动态库的优缺点和使用用途:

    dll和lib可以比作这样的公司:  dll就像一个外包的公司,可以被任意的程序使用,而lib就像一个大公司下的一个研发部分,只能加载到文件中才能被使用。

   1.  dll------- 不需要更新执行文件,只需要更新dll文件 ,而lib,每次更新,需要重新编译源文件成执行文件。

    2.  dll 节约计算机资源,需要使用时加载,不需要使用时释放。 lib 浪费较多的资源,是软件的体积变得越来越庞大。

在这些情况下可以使用lib:

需要私有化,就是仅供自己使用时。不需要经常改动时文件时。

在这些情况下可以使用dll

希望被很多的应用使用,需要经常的更新功能,经常被用来使用做劫持别人的文件。

C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)的更多相关文章

  1. Windows下静态库、动态库的创建和调用过程

    静态库和动态库的使用包括两个方面,1是使用已有的库(调用过程),2是编写一个库供别人使用(创建过程).这里不讲述过多的原理,只说明如何编写,以及不正确编写时会遇见的问题. //注:本文先从简单到复杂, ...

  2. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  3. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

  4. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  5. [转]Linux下用gcc/g++生成静态库和动态库(Z)

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

  6. Linux-Gcc生成和使用静态库和动态库详解

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  7. makefile生成静态库和动态库

    库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...

  8. Ubuntu下通过makefile生成静态库和动态库简单实例

    本文转自http://blog.csdn.net/fengbingchun/article/details/17994489 Ubuntu环境:14.04 首先创建一个test_makefile_gc ...

  9. 【转】Linux下gcc生成和使用静态库和动态库详解

    一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不 ...

随机推荐

  1. BZOJ 3171 循环格(费用流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3171 题意: 思路:若能构成循环,则每个格子的入度出度 均为1.因此将每个点拆成两个点x ...

  2. javascript encodeURI和encodeURIComponent的比较

    总结:encodeURI对除三种字符()之外的字符进行编码 encodeURIComponent对除两种字符之外的字符进行编码,保留字符会被转义 在进行SaaS前端开发的时候,大家经常会用到两个Jav ...

  3. nuget.exe the application could not be started

    http://stackoverflow.com/questions/5730412/error-when-running-the-nuget-exe-command Ok, so this turn ...

  4. [Lonlife1031]Bob and Alice are eating food(递推,矩阵快速幂)

    题目链接:http://www.ifrog.cc/acm/problem/1031 题意:6个水果中挑出n个,使得其中2个水果个数必须是偶数,问有多少种选择方法. 设中0代表偶数,1代表奇数.分别代表 ...

  5. [SAP ABAP开发技术总结]CLEAR、REFRESH、FREE内表清理区别

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. Java方法

    所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.p ...

  7. HUD 2203 亲和串

    HUD 2203 亲和串 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768K (Java/Others) [题目描述 - ...

  8. 线程入门之start()和run()的区别

    package com.thread; /** * start()和run()的区别 * start():并行执行 * run():方法调用,顺序执行 * @author 95Yang */ publ ...

  9. 可以考虑使用SublimeText编辑器替代notepad++了

    大概是去年吧,这款编辑器神一般的出现在我面前,经过我小心翼翼的试用后发现并不是那么太顺手,插件配置都不太成熟,如Package Control. 最喜欢用它的zencoding还得专门开个小窗:ang ...

  10. 测试框架Mockito使用笔记

    Mockito,测试框架,语法简单,功能强大! 静态.私有.构造等方法测试需要配合PowerMock,PowerMock有Mockito和EasyMock两个版本,语法相同,本文只介绍Mockito. ...