`
hereson
  • 浏览: 1428080 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

阅读更多

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


上文回顾:


上文《Dev-Cpp/Mingw32 环境介绍(4)》我们介绍了如何使用 静态连接库。今天我们介绍如何制作自己的Mingw32的静态链接库。至于Win32下的那种静态连接库我想熟悉Win32的人应该很清楚如何制作。所以我们这里就不做介绍了。

 

第八章 制作自己的静态链接库


这是第八章,八这个数字很多人都喜欢。我也一样。(感觉好迷信啊。)这一章我们要来制作静态链接库,我相信各位一定会很高兴的。
首先我先简单介绍一下静态链接库的作用。我们知道,C/C++程序生成目标代码的过程有,编写代码,编译代码,连接代码,生成目标代码。在连接代码的时候,会将编译后的二进制代码连接成目标代码。但是,有些时候。我们想让程序导入必要的代码,而不想导入无用的代码到我们的程序中。我们该如何呢?很简单,使用静态连接库。使用它我们就可以实现将在程序中使用的函数导入的目的。
下面我们来一步步的学做静态链接库并且学会如何使用。
我们现在先写一段代码,你可以用Dev也可以用记事本也可以用任何你喜欢的文本编辑器。像我就比较喜欢vi或者emacs作为平时的文本编辑器。话说远了,现在言规正传。我们写下下面的代码。

//HelloWorld.c

#include <stdio.h>

void HelloWorld(void)
{
        printf("Hello World");
}

上面那段C代码各位应该很熟悉的吧,那么经典的Hello World好让我怀念啊。保存为HelloWorld.c以后我们就开始生成了。
首先,我们先编译HelloWorld.c

gcc -c HelloWorld.c -o HelloWorld.o

这样我们得到一个二进制的文件HelloWorld.o

接着我们生成静态库。

ar cqs libHelloWorld.a HelloWorld.o

这样我们党额静态链接库就好了。如果有需要可以将其他的二进制文件名加HelloWorld.o的后面将他们连接成一个静态链接库。另外,生成的静态库文件名必须为lib*.a

好了,现在我们来使用我们的库吧。

接下来,我们为了能够使用方便,写一个如下头文件。

//HelloWorld.h
void HelloWorld(void);

接着我们开始使用我们刚才生成的静态库。写一个main.c的文件。

//main.c

#include "HelloWorld.h"

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

使用gcc编译,假设我们这里所有的文件都保存在同一个目录下。

gcc -c main.c -o main.o

然后我们连接程序。

gcc main.o -o main.exe -L"./" -lHelloWorld

如果顺利我们会得到一个main.exe的文件。

在控制台下输入main.exe或者main就可以出现 Hello World 这组单词。

看了上面的文章是否很兴奋想要生成自己的静态链接库?其实,我个人觉得mingw32生成静态链接库要比VC生成的简单。不知道你有没有这样的感觉。

当然,如果你要在Dev下使用静态连接库,也是可以的。方法我在上一章已经说过了。只是,如果你要使用自己的库必须设置路径。

只要在连接器参数中添加 -L"你的库的所在的文件夹" 或者 将你的库保存到Dev安装目录中的lib目录中。

好了,本文就介绍到这里。如果有什么问题,可以在这里留言。

问外音:


这篇文章其实我真的很喜欢,不是文章喜欢,而是内容很喜欢。不知道各位如何想。这里介绍了一个生成静态库的方法,感觉比VC生成的要简单。其实在gcc的Linux平台下生成动态连接库还要比VC下生成不知道要简单多少倍了。如果说Win32中用于开发最好的平台是win2000那么,在那么x86系统中用于开发的平台莫过于Linux了。这章的内容也许对许多的程序员都有些陌生,我实在担心各位会在实践中会碰到问题,所以在这里还是希望各位在遇到困难时多到这里提问。最后还是我的一句名言:不论是程序还是思想唯有通过不断的交流才能愈加完善。(看过《古畑任三郎》么?主角总喜欢在发表观点后,说一句:我是古畑任三郎。感觉我也和他一样了。不过,这的确是一部不错的影片。至少比国内许多侦探片都好,没有额外的剧情,没有你你我我的爱情。纯粹是从一个破案的角度来拍摄的。推荐各位看看。)

 

STUDIO软件开发组

北斗星君(黄庠魁)

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
北斗星君(黄庠魁)

分享到:
评论

相关推荐

    Dev-CppMingw32环境介绍(DOC)

    第九章 制作自己的动态链接库 第十章 使用自己的动态链接库 第十一章 在Dev-Cpp中创建自己的工程 第十二章 在Dev-Cpp中生成自己的包 第十三章 Dev-Cpp包制作补完篇 第十四章 wxWidget的下载与安装 第十五章 wxWidget...

    软件破解入门教程.txt

    第十七课 动态链接库 第十八课 通用控件 第十九课 树型视图控件 第二十课 窗口子类化 第二十一课 管道 第二十二课 超类化 第二十三课 系统托盘中的快捷图标 第二十四课 WINDOWS钩子函数 第二十五课:位图...

    Visual_C++精彩实例详解

    2. 本书例程大部分采用的是动态链接,读者在未装VC的PC机上运行每章例程中的可执行文件时,可能会出现找不到mfc42.dll等动态链接库的情况, 读者此时可采用静态链接,具体操作为:VC中菜单Project-&gt;Setting-&gt;...

    Visual_C++精彩实例详解.part2.rar

    2. 本书例程大部分采用的是动态链接,读者在未装VC的PC机上运行每章例程中的可执行文件时,可能会出现找不到mfc42.dll等动态链接库的情况, 读者此时可采用静态链接,具体操作为:VC中菜单Project-&gt;Setting-&gt;...

    Visual_C++精彩实例详解.part4.rar

    2. 本书例程大部分采用的是动态链接,读者在未装VC的PC机上运行每章例程中的可执行文件时,可能会出现找不到mfc42.dll等动态链接库的情况, 读者此时可采用静态链接,具体操作为:VC中菜单Project-&gt;Setting-&gt;...

    Visual_C++精彩实例详解.part5.rar

    2. 本书例程大部分采用的是动态链接,读者在未装VC的PC机上运行每章例程中的可执行文件时,可能会出现找不到mfc42.dll等动态链接库的情况, 读者此时可采用静态链接,具体操作为:VC中菜单Project-&gt;Setting-&gt;...

    Visual_C++精彩实例详解.part3.rar

    2. 本书例程大部分采用的是动态链接,读者在未装VC的PC机上运行每章例程中的可执行文件时,可能会出现找不到mfc42.dll等动态链接库的情况, 读者此时可采用静态链接,具体操作为:VC中菜单Project-&gt;Setting-&gt;...

    Flash格斗动画的动作设计和动作的制作.doc

    9: 人物的造型基本完成了, 那么现在就开始学习如何作动作, 首先打开库面板, Ctrl+L, 然后右键原型-直接复制, 并且命名, 随便命名. (*提示: 由于我们就于教程所以涉及的内容比较少, 但当正式制作的时候文件的命名和...

    python入门到高级全栈工程师培训 第3期 附课件代码

    第9章 01 Python开发系列课程概要 02 Python作业要求以及博客 03 编程语言介绍 04 Python种类介绍 05 Python安装以及环境变量的操作 06 Python初识以及变量 07 Python条件语句和基本数据类型 08 Python while循环...

    Visual C++ 音频/视频 处理技术及工程实践(分卷3)

    2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 ...

    金品皮肤dll控件Skinsharp+V1.0.6.6

    超轻量级换肤,SkinSharp不依赖于任何第三方类库或模板库(STL,MFC,ATL等),仅仅使用到系统最基本的核心动态链接库。因此体积在同类产品上是最小的,仅不到200K,运行效率也是最高的,所有绘制和操作全部都是基于...

    Visual C++音频/视频处理技术及工程实践(分卷2)

    2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 ...

    完全掌握加密解密实战超级手册.z01

    2458.5 专家点拨:常见问题解答 247第9章 网络验证技术大放送 2489.1 实现Web服务器网络验证 2499.1.1 加密客户端 2499.1.2 控制本地计算机 2529.2 实现本地服务器验证 2569.2.1 加密客户端 2579.2.2 加密服务器端 ...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

    Visual C++音频视频处理技术及工程实践(含源码2/2)

    2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3 常用消息 66 ...

    Visual C++音频视频处理技术及工程实践(分卷9)

    2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 ...

    Visual C++音频视频处理技术及工程实践地址

    2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3 常用消息 66 ...

    Visual C++音频视频处理技术及工程实践(分卷0)

    2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 ...

    Visual C++音频/视频处理技术及工程实践 (分卷1)

    2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2 生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 ...

Global site tag (gtag.js) - Google Analytics