当前位置: 首页 > news >正文

Dev-Cpp/Mingw32 环境介绍(6)

Dev-Cpp/Mingw32 环境介绍(6)


上文回顾:
上文《Dev-Cpp/Mingw32 环境介绍(5)》中,我们了解了如何来制作静态连接库。的确,上一片文章至今已经很长时间了。所以,我这次会用更多的内容来回报各位读者的。下面我们就来说说如何制作动态链接库。

第九章 制作自己的动态链接库

“我没有做梦吧,Mingw32也能做win32的动态连接库?”对你没有做梦,我也没有胡说。下面我简单介绍一些动态库的生成和使用。
还是老样子,我们来开启Dev-Cpp,然后我们新建工程。选择DLL工程。这个就是我们的链接库。在新建以后,我们会生成一个dll.h和一个工程名.c文件。其中,dll.h中保存的是你动态库的函数。下面我们看看我的文件内容。

//dll.h
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


#endif /* _DLL_H_ */

#include <windows.h>

BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

/* Returns TRUE on success, FALSE on failure */
return TRUE;
}

DLLIMPORT int HelloWorld(void);

//dll.h End

其中我在最后一行加入了自己的函数,HelloWorld。

下面我们来看看我的HelloWorld.c

//HelloWorld.c
#include "dll.h"

DLLIMPORT int HelloWorld(void)
{
printf("Hello,World!");
return(0);
}

//HelloWorld.c End

好了,我们就来编译吧。使用Dev的编译命令或者用如下命令。

我们将会得到两个文件。一个libHelloWorld.a,一个HelloWorld.dll。我们使用这两个文件就可以编程了。

文外音:
说实话,这次这篇文章和前几篇文章相比间隔确实有些长了。由于我前一阶段有些忙了,所以,这次为各位读者抱歉了。下面我们要学的是如何使用刚才我们编写的动态库。

第十章 使用自己的动态链接库

上文回顾:
上文,我们介绍了如何生成动态库。下面我们就来使用它吧。

新建一个工程main.c的文件如下

//main.c

#include <stdio.h>
#include <stdlib.h>
#include "dll.h"

int main()
{
HelloWorld();
return(0);
}

//main.c End

现在将刚才那个工程中的 dll.h libHelloWorld.a HelloWorld.dll文件复制到你现在工程的目录里。

然后,我们现在开启工程属性。在链接器一栏中加入

-l"HelloWorld"

保存工程后编译。一切成功后,我们就获得了使用动态链接库的方式了。以后我们只要修改链接库的HelloWorld就可以修改程序中的显示。希望这篇文章各位能满意。

文外音:
的确,现在很忙,所以文章的质量也下降了不少。不过还是希望给为能够多多谅解。最近在搞NASM汇编。发现其实Emcas和Nasm确实很不错。非常喜欢。不过,C我还是会追求的。只是,可能以后和各位的交流会少些,但是我还是会用我的文章来使各位获得有关Dev的内容。本系列文章,未完,待续。






STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)

相关文章:

  • 【解决方案】使用Wireshark工具抓取TCP数据包时为什么遇到了52.114.77.164与168.63.202.111?
  • t.k.x's ACM(2)---不敢报希望的准备
  • C++面向对象程序设计:银行储蓄管理系统
  • C++面向对象程序设计:地铁自动售票系统
  • t.k.x's ACM(3)---险过的网上预赛
  • 计算机网络实验: 使用Wireshark抓包工具进行应用层和传输层网络协议分析(TCP部分)
  • t.k.x's ACM(5)---平静的上海
  • 计算机网络实验: 使用Wireshark抓包工具进行应用层和传输层网络协议分析(HTTP部分)
  • t.k.x's ACM(6)---总结
  • 数据库理论:计算机数据库技术在信息管理中的应用分析
  • 郁闷的一天
  • 数据结构:参数化循环链表的C++实现(实现异常捕获)
  • 编译原理:TINY语言的语法、词法单元与文法的最全总结
  • ACCESS在NTFS中只能读不能修改问题
  • 学期结束前的聚餐
  • 2017-09-12 前端日报
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • ES6系统学习----从Apollo Client看解构赋值
  • express如何解决request entity too large问题
  • HashMap剖析之内部结构
  • Intervention/image 图片处理扩展包的安装和使用
  • PAT A1017 优先队列
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 如何进阶一名有竞争力的程序员?
  • 深度解析利用ES6进行Promise封装总结
  • 手写双向链表LinkedList的几个常用功能
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #pragma once与条件编译
  • #pragma 指令
  • #前后端分离# 头条发布系统
  • (Java数据结构)ArrayList
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (四)c52学习之旅-流水LED灯
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .“空心村”成因分析及解决对策122344
  • .gitignore
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net 程序发生了一个不可捕获的异常
  • .NET 事件模型教程(二)
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .net6 webapi log4net完整配置使用流程
  • .net6使用Sejil可视化日志
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .net实现客户区延伸至至非客户区
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @Bean, @Component, @Configuration简析