下面我们将用两种不同的姿势来用VS2017生成dll文件(动态库文件)和lib文件(静态库文件),这里以C语言为例,用最简单的例子,来让读者了解如何生成dll文件(动态库文件)

生成动态库文件

姿势一:

第一步:新建一个项目

第二步:选择Windows桌面向导(这里先不要去管上面的“动态链接库(DLL)”)

 第三步:选择动态链接库,并空项目打勾√

 第四步:添加一个.c源文件

第五步:(因为这里以C语言为例子,将后缀改为.c)

第六步:在c文件中输入一个简单的函数这里使用了_declspec(dllexport),但_declspec(dllexport)并不是必须的,后面一种方法将不使用_declspec(dllexport)

_declspec(dllexport) int sum(int a, int b)
{return a + b;
}

第七步:新建一个头文件

 第八步:在头文件中输入函数的声明

第九步:编译

第十步:Debug文件夹下的两个文件DLL.dll和DLL.lib就是我们要使用的两个文件了

因为使用的_declspec(dllexport),虽然这里我们只编译了一次,却生成了dll和lib两个文件

姿势二

第一步到第五步和上面的步骤一模一样,这里从第六步开始讲起

第六步:在c文件中输入一个简单的函数(注意这里就没有使用_declspec(dllexport))

第七步:添加一个头文件

第八步:在头文件中输入函数的声明

第九步:编译

第十步:这时在Debug文件里就可以看出两种方法的区别了,第二种方法没有加 _declspec(dllexport) 只有一个dll文件,如果我们也想要lib文件,需要额外几个步骤

生成lib文件

第十一步:点击项目——》DLL属性

第十二步:配置属性——》项目默认值——》配置类型,把动态库(.dll) 改为 静态库(.lib)

第十三步:编译

第十四步:这个时候Debug文件夹里面就多出了一个lib文件

从上面两个例子可以看出:

在生成dll文件(动态库文件)时,如果不使用_declspec(dllexport)那么就只有dll文件,在这种情况下就无法使用#pragma comment来隐式装载动态库(因为需要lib文件),只能使用LoadLibrary来显式装载动态库(使用Loadlibrary只需要dll文件

如果使用了_declspec(dllexport)那么就既有dll文件,也有lib文件

还有一点需要注意的是,如果在源文件(.c文件)中函数的定义没有_declspec(dllexport)

,但是在头文件中函数的声明使用了_declspec(dllexport)此时编译产生的文件只有dll文件,如果改成源文件中有_declspec(dllexport),头文件中没有_declspec(dllexport),那么编译产生的文件既有dll文件也有lib文件

(导出dll文件时最好还是在源文件和头文件中都加上_declspec(dllexport)

笔者记录了一下加与不加_declspec(dllexport)对导出dll文件大小的影响,以上面的代码为例

(造成dll文件大小不同的原因,笔者暂时无法给出解释,待补充)

生成静态库文件

和生成dll文件步骤相似,这里就不再赘述了,直接上图

第一步:

第二步:建议把预编译标头的勾去掉,(不去掉也没事,只是本文为了简洁,让读者更清楚的生成步骤)

第三步:

第四步:

第五步:

在源文件中输入以下代码:

int sum(int a, int b)
{return a + b;
}

第六步:

第七步:

第八步:

第九步:编译,可以看到Debug文件夹下有一个lib文件

笔者记录了一下加与不加_declspec(dllexport)对导出lib文件大小的影响,以上面的代码为例

(至于为什么加了_declspec(dllexport)后,lib文件会出现0.02KB的差别)

有的读者可能会发现在网上很多博客写关于生成dll文件时,头文件里面的写法是这样的

刚接触预处理命令的读者看着可能会有点不好理解,下面对上面的头文件中的代码逐个分析,笔者将上面的代码分为两个个部分(对预处理命令不是很熟悉的读者可以先看一下这一篇随笔:

第一部分:

#pragma once
#ifdef DLL_EXPORTS
#define DLL _declspec(dllexport)#else
#define DLL _declspec(dllimport)#endif

把上面的代码翻译一下就是:如果DLL_EXPORTS这个宏名已经被定义,那么DLL就等价于_declpsec(dllexport),否者DLL就等价于_declspec(dllimport),  #pragma once保证了该头文件只被包括(#include)一次,

在很多头文件中都可以看到#pragma once,比如stdio.h

读者这个时候可能就有疑问了,明明我没有#define DLL_EXPORTS,为什么是执行#define DLL _declspec(dllexport)而不是#define DLL _declspec(dllimport)呢?

首先读者需要知道的是DLL_EXPORTS是一个预定义的宏,因为我们是生成的是DLL文件

可以在属性->配置属性->C/C++->预处理器中看到

现在读者应该清楚了,在生成DLL文件时,编译器已经预定义了DLL_EXPORTS这个宏名,如果我们是生成的应用程序

上面的代码写成

#ifdef
```
#else
```
#endif

这种形式是为了方便在使用的时候lib或者dl文件时,需要引入头文件的时候方便一点,不需要对头文件做任何的修改(因为如果我们使用的配置类型是“应用程序(.exe)”,那么就没有预定义DLL_EXPORTS)

第二部分:

#ifdef _cplusplus
extern "C"
{
#endifDLL int sum(int a, int b);
#ifdef _cplusplus
}
#endif

把上面的代码翻译一下就是:如果是C++文件(.cpp后缀)那么就是

extern "C"
{DLL int sum(int a, int b);
}

如果不是C++文件,那么就是

DLL int sum(int a, int b);

关于extern "C"作用,可以看一下这篇文章:

总结一下:

生成动态库文件

头文件:

 1 #pragma once2 #ifdef DLL_EXPORTS3 #define DLL _declspec(dllexport)4 5 #else6 #define DLL _declspec(dllimport)7 8 #endif9
10 #ifdef _cplusplus
11 extern "C"
12 {
13 #endif
14     DLL int sum(int a, int b);
15 #ifdef _cplusplus
16 }
17 #endif

源文件:

1 _declspec(dllexport) int sum(int a, int b)
2 {
3     return a + b;
4 }

编译之后产生:

生成静态库文件:

头文件:

 1 #pragma once2 3 #ifdef _cplusplus4 extern "C"5 {6 #endif7     int sum(int a, int b);8 #ifdef _cplusplus9 }
10 #endif

源文件:

1 int sum(int a, int b)
2 {
3     return a + b;
4 }

编译后产生:

到这里本文就基本结束了,上面详细叙述了生成dll文件(动态库文件)和lib文件(静态库文件)的步骤。

如何生成dll文件 采用VS2017生成dll文件(动态库文件)和lib文件(静态库文件)以C语言为例相关推荐

  1. 如何生成lib文件 采用VS2017生成lib文件(静态库文件)以C++语言为例 静态库的生成和使用

    开发环境 VS2017  先展示项目解决方案的结构,代码量很小 第一部分:生成静态库,即.lib文件 第一步:新建一个空项目 打开VS2017,文件->新建->项目,选择"空项目 ...

  2. 头文件和库文件区别,动态库和静态库的区别,动静态库的生成

    文章目录 一.什么是头文件?什么是库文件?有什么区别? 先说总结 目标文件 二.什么是静态库?什么是动态库?有什么区别? 三.为什么只用在程序头部写上包含的头文件,头文件中并没有实现内容就可以使用声明 ...

  3. lib(静态库)和dll(动态库)的生成和使用详细说明以及注意事项

    1.lib库我们称之为静态库,在编译的时候调用,而dll库早使用的时候地时候调用. 如果你希望自己写的库既能给c语言用,又能给c++语言用.就需要写一个宏,如下所示,这个宏表不管是C++工程调用还是C ...

  4. python生成静态库_使用boost.python静态库

    编译脚本为: bjam stage toolset=msvc link=static runtime-link=shared threading=multi variant=debug,release ...

  5. 基础IO(文件接口、安装内核源码超详细步骤图解、静态库与动态库)

    基础IO C语言的文件操作接口 fopen fclose fread fwrite fseek 系统调用文件接口 open close read write lseek 安装内核源码 文件描述符&am ...

  6. VS2017 生成DLL 供python 调用

    今天突然想到python调用C++的问题,其中碰到了很多坑,最后终于弄好了,写博客来记录一下,以免忘记了: VS2017生成DLL python调用 VS2017生成DLL 1.新建项目->wi ...

  7. 库文件、静态库(lib)与动态库(dll)的生成与使用

    静态库 程序编译一般需经预处理.编译.汇编和链接几个步骤.在应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所需的代码,复制到 ...

  8. VS2019:C++程序lib静态库、dll动态库的生成和使用

    一.静态库 静态库的使用需要(1).h头文件:(2).lib静态库文件: 1.静态库生成 (1)项目-右键属性-常规-配置类型-选静态库: (2)点击生成,Debug文件夹下出现lib静态库: 2.静 ...

  9. automake生成静态库文件_动手 | 奶奶级的动态库入门

    程序编译过程 库文件 静态链接和动态链接的区别? 从0开始 - 创建和使用静态链接库 创建静态库项目 向静态库中添加文件 编译静态库 创建引用静态库的C++控制台应用 在应用中使用静态库功能 从0开始 ...

  10. Linux系统上库文件的生成与使用(静态库和动态库)

    目录 1.什么是库文件? 2.静态库的生成与使用 2.1.生成 .o 文件 2.2.创建静态库 2.3.使用静态库 3.动态(共享)库的生成与使用 3.1.生成 .o 文件 3.2.生成动态库文件 3 ...

最新文章

  1. docker java镜像_Docker JDK镜像
  2. 以“百钱买百鸡”问题练习使用 C语言 goto 语句
  3. 手机APP夏季促销UI设计PSD模板|糖果色彩,抓住眼球
  4. python工资这么高为什么不学-一个来自35岁职场高管的忠告:Python为什么不得不学?...
  5. 第七次网页前端培训(JS)
  6. python机械臂写字_SCARA机器人 机械手臂 写字机 DIY 视觉识别
  7. 数据结构与算法-进阶(五)图的实现
  8. Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD
  9. 电脑桌面便签软件怎么新建内容?
  10. Python faker函数
  11. 七彩虹 iGame G-ONE Plus 27寸游戏一体机 评测
  12. 阿里云创建AccessKey 和 Access Key Secert
  13. R语言 Hurst指数计算
  14. Transformer 和卷积神经网络在跨物种基因组DNA N6甲基腺嘌呤位点识别中的应用
  15. 【路径规划】基于灰狼算法实现机器人栅格地图路径规划matlab源码
  16. Python神经网络编程学习记录(一)
  17. 阿里云现代农业园区解决方案,智慧园区大数据、产品管理、物联网、企业管理平台解决方案
  18. iframe例子 (
  19. JDK14环境变量配置,JDK版本切换(Win10)
  20. putty+xming树莓派远程显示图片/图形界面

热门文章

  1. numpy中的revel和flatten
  2. 机器学习(Machine Learning)深度学习(Deep Learning)资料(下)
  3. java 检查 死链接_如何检查网站死链(网站死链接如何简易识别及处理)
  4. 哇!家居环境居然能“可视化”?这守护真的牛
  5. AngularJS总结
  6. Python sys模块常见函数
  7. 摩尔投票(包含题目讲解)
  8. 上海杉达学院计算机课程,上海杉达学院计算机科学与技术专业介绍
  9. 完美解决onenote同步速度慢(修改hosts文件)以及如何取得文件修改权限
  10. SpaceSniffer(磁盘大小扫描分析) 彻底解决C盘爆满问题 清理C盘必备软件