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

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

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页