动态库的创建与使用(1)

我们都知道库的作用有两个:1.文件共享的作用 2.知识产权的保护,虽然说库的功能都是一样的,但是动态库的制作比静态库稍微麻烦一些。到底哪些地方比较麻烦呢?

1)首先创建一个Win32动态链接库的工程。

2)在头文件中给出函数的声明,在源文件中给出函数的实现。

3)在打开工程的debug文件后我们发现有一个.dll文件,这就是传说中的静态库文件。但是这个文件暂时还不能使用。我们打开这个文件发现这里面都是二进制代码我们不能看懂。但是有专门针对二进制文件的工具。打开工具栏,点击depends点开后将这个.dll文件拖入,我们就可以看见相应的信息,但遗憾的是我们在这里什么都没有看见。

这就需要我们在头文件函数声明处加上一定的信息。将函数声明为导出函数。如下:

当函数声明为导出函数时,库里面就会重新生成一个 .dll文件,还会多出一个.lib文件(如果没有声明为导出函数,则不会出现.lib文件)。再打开depends工具我们就会发现一个函数而不是什么都没有。

使用方法:1)创建一个普通的文件,将动态库里面的.dll文件和.lib文件拷贝复制到新创建普通文件的debug里面。再把相对应的头文件也拷贝进去(动态库的头文件)

2)动态库使用方式分为两种,一种为静态加载方式,一种为动态加载方式。

静态加载方式:在生成动态库的同时,也生成了静态库文件,这个静态库文件的生成是为了方便静态加载动态库。在程序里面引入#pragma comment(lib,"静态库名.lib")之后就可以使用了。但是只能使用导出了的函数。没有生成的导出函数相当于库中的私有成员,只能在内部使用。

将主程序里面的.exe文件拷贝出来运行,我们发现程序不能运行,原因是不能找到相应的动态库。但是静态库的.exe文件提出来后可以随便运行,这样我们就发现了静态库与动态库的一些不同之处:静态库是一次编译到处执行,他把所用到的所有库文件信息全都包含进去,所以无论把文件放在任何地方,他的运行都不会依赖于其他文件。但动态库不可以,他的运行必须依赖于动态库和静态库。

当程序开始运行时,整个静态库全部被加载到了程序里面,如果程序结束,这个库也就自然被释放掉,只是程序的运行必须要依赖于动态库的文件。动态加载更灵活一些。但其加载方式就要相应的复杂一些。

动态加载方式:动态加载方式依赖于三个函数的应用。一个叫LoadLibrary()加载库函数,一个是从加载的库函数里获取一个处理函数的地址的函数GetProcAddress(),另一个是释放库文件的函数FreeLibrary().如果我们对这些函数不熟悉的话,我们可以查看MSDN进行查看。

要想动态加载,我们首先得加上一个头文件:#include<windows.h>

给出一个文件句柄,使用LoadLibrary(“动态库的名字.dll”)函数。条件判断后,如果加载成功,相当于文件被打开了,然后在文件里获取所需要的函数(函数必须导出过)出来。判断获取是否成功,如果成功就调动这个函数。处理完成后再调动库函数FreeLibrary()释放库文件。

这样就加载完成。但是我们发现在调用GetProcAddress()函数时调用的函数名有些看不懂,这是C++文件内部对函数的命名,我们可以这样查看:打开工具栏点击depends,然后把动态库文件拖进去查看他的名字。但是这种方式稍微麻烦了一点,我们可以换另外一种方式。

在写导出函数时给前面加上extern  "C",即声明成C的扩展方式。扩展后即可以用普通的函数名来调用。这样使调用变得简便,但是必须保证函数不能重载(C语言不支持函数重载)。

动态加载完毕,如果去掉静态库文件程序照常运行。它的加载只需要.dll文件即可。

时间: 2024-10-06 13:15:36

动态库的创建与使用(1)的相关文章

VC++6.0 动态库的创建与调用(非MFC的dll)

非MFC动态库的创建... 一个lib.cpp,一个lib.h /*lib.h*/ #ifndef LIB_H #define LIB_H //声明add为dll的导出函数. extern "C" int _declspec(dllexport)add(int x,int y); #endif 也可以加上def文件 ; lib.def : 导出DLL函数 LIBRARY DllTestDef EXPORTS add @ 1 非MFc动态库的调用 1.静态调用 //静态的调用dll动态库

C/C++ (函数、变量和类)动态库的创建、导出和使用(图文+示例代码)

 一 Windows库 1引入库的原因: a.项目的复杂程度大 b.提高代码的利益利用率 2库的分类 2.1静态库: *.lib,不能被加载的程序,可以理解为目标程序的归档. 2.2动态库:*.dll,可以被应用程序加载的程序. 二 动态库 1动态库优点 1.1可以提供模块化的方式,方便协调开发(对于大项目,每个人写的东西编译为动态库,直接链接即可) 1.2对源代码保护 1.3减小可执行文件大小 1.4提高代码重用率 2动态库的基本使用方法 2.1动态库的创建 2.2加载动态库 2.3获取并

linux下动态库的创建与使用

动态库创建 1.编译动态库 Vim add.cpp int add(int a, int b) { return a + b; } Vim add.h Int add(int a, int b); g++ add.cpp -o libadd.so -fPIC -shared 2.链接动态库 #include "add.h" #include <iostream> int main() { int ret = add(2, 3); std::cout << ret

静态链接库与动态链接库的区别及动态库的创建(转)

一.引言通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下.所以这些函数库被成为静态库(static libaray),通常文件名为"libxxx.a"的形式.其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime).这就是如雷贯耳的动态

动态库的创建和调用

(一)动态链接库和静态链接库 静态链接库:lib中的函数不仅被连接,全部实现都被直接包含在最终生成的EXE文件中,只是实现是不可见的. 动态链接库:dll不必被包含在最终的EXE中,静态调用时仅把函数名或者变量名或者类名链接到EXE文件中,而这些东西的实体都只有在运行时才从动态库中导入到可执行文件中,动态调用的时候EXE文件执行时可以直接动态地引用和卸载DLL文件. 同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库. (二)回顾一下VC++支持的DL

Windows静态库和动态库的创建和使用(VS2005)

偶们在实际的编程开发中,经常会遇到运行时无法找到某个DLL文件或者链接时无法找到某个LIB文件.然后,我们就开始乱GOOGLE一下,然后将VS2005的设置改变一下,或许就Ok了,我们将别人开发的DLL或者LIB导入到我们的编程中,那么这些lib,DLL到底是什么呢?下面,偶就细细道来. 首先,偶们说第一个:静态链接库(Static Libary) 偶们用VS2005做一个静态链接库先 打开VS2005,新建à项目(staticCai)àWin32控制台应用程序 新建static_lib.h 和

静态库与动态库的创建与使用

静态库:Windows中为后缀为.lib的文件,Linux中为.a文件: 动态库:Windows中为后缀为.dll的文件,Linux中为.so文件: Windows中: 调用静态库:将静态库路径添加进来——依赖静态库(或者#pragma comment(lib,xx.lib))——包含头文件——,用户程序中则可直接调用静态库中的函数 调用动态库:分为1)静态调用,即隐式调用:将库路径和头文件路径添加进来——依赖静态库选项(或者#pragma comment(lib,xx.lib))——包含头文件

C语言函数篇(五)静态库和动态库的创建和使用

使用库函数是源码的一种保护?我猜的. 库函数其实不是新鲜的东西,我们一直都在用,比如C库. 我们执行pringf() 这个函数的时候,就是调用C库的函数. 下面记录静态库和动态库的生成和使用. 静态库:libxxx.a 动态库:libxxx.so 静态库: 在程序编译的时候,将库编译进可执行程序中, 运行的时候不需要外部函数库 动态库: 在程序运行的时候,将库加载到程序中,运行的时候需要外部函数库 函数库的目录有 /lib 和 /usr/lib 和 自定义 头文件是库文件的辅助,头文件就像是目录

windows库的创建和使用:静态库+动态库

windows库的创建和使用:静态库+动态库 一.静态库的创建和使用 1. 静态库创建 (1)首先创建工程test,测试代码如下: 1) test.h void test_print(); 2) test.cpp #include "test.h" #include <stdio.h> void test_print() { printf("test_print in static lib."); } 3)右击工程test:属性-->配置属性--&