您的位置:首页 > 其它

静态连接库与动态链接库

2011-10-13 19:22 155 查看
静态链接库(简称静态库)和动态连接库(简称动态库)在windows编程过程中经常碰到,很多人都在用,如果详细追究也没几个人能说的清楚。自己以前看过多次,每次看都不是很完整,看过之后不久也就忘记了。希望通过这次总结可以加深印象,提升对库的理解,本文章所用vs为vc6.0。

1、静态库

1.1、两种指定静态库的方法

静态库是经常使用的。两种方式指定lib库

(1) 在工程属性中设置,如下图

Ø 需要在debug和release时都添加lib库,当然也可以选择”SettingsFor”->”All Configurations”来添加lib库。

Ø 当工作区文件丢失后,添加的lib库文件名即丢失。

(2) 用#pragma预处理命令。

Ø #pragma comment(lib, "iphlpapi.lib")

Ø 可以在文件中直观的看到用到哪些lib库

Ø 当vc工作区文件(dsw)丢失时,重建dsw文件即可编译。

Ø 不需要debug和release都添加库文件名。

1.2、创建一个静态库

像上图创建一个“Win32Static Library”,下一步,可以选择Pre-Compiled header和MFC support两项,我们暂时先不选择。新建staticlib.h和staticlib.cpp。



staticlib.h



#ifndef __STATIC_LIB_H

#define __STATIC_LIB_H

extern "C" int add(int, int);



#endif



staticlib.cpp

#include "staticlib.h"

int add(int a, int b)

{

return a + b;

}

在staticlib的工程属性页post-build step中添加build后的执行命令。工作路径是staticlib文件夹

copy staticlib.h ..\libtest\staticlib.h

copy debug\staticlib.lib ..\libtest\staticlib.lib





1.3、调用静态库

静态库不会生成dll程序。调用静态库需要两个要件:

Ø 头文件

Ø lib库文件

创建一个libtest工程项目来调用staticlib库函数,当然最好把staticlib.h加入到工程中。在build libtest程序时,会把staticlib库中的add函数加到libtest中。



libtest.cpp



#include "staticlib.h"



int main(int argc, char* argv[])

{

//printf("HelloWorld!\n");

inta = 1, b = 2, c = 0;

c= add(a , b); //加入头文件后可以直接调用函数。

printf("%d\n",c);

return0;

}

如果staticlib与libtest两个工程没有建立关联性,则需要用#pragma comment(lib,”staticlib.lib”)来指定。



2、动态库

2.1、创建一个动态库

下一页有三个选项,我们暂时现则为空DLL工程。下面两个以后讲解。

动态链接库只有输出函数或数据才有意义,输出函数方法有两种:

Ø 用_declspec(dllexport)修饰函数

Ø 添加.def文件,将输出函数写在def文件中。

如果以上两种都没有实现,则不能调用动态链接库中的函数。用dependency工具可以查看导入导出函数。



dynamiclib.h



#ifndef __DYNAMIC_LIB_H

#define __DYNAMIC_LIB_H



#ifdef BUILDING_DLL

#define DLLIMPORT _declspec(dllexport)

#else

#define DLLIMPORT _declspec(dllimport)

#endif



extern "C" int DLLIMPORTMulti(int, int);



#endif



dynamiclib.def



;LIBRARY dynamiclib



EXPORTS



Multi

在def文件中不允许用@1等指定导出次序。

dynamiclib.cpp



#define BUILDING_DLL

#include "dynamiclib.h"





int Multi(int a, int b)

{

returna * b;

}



如果以上两种方式都没有实现,用dependency不能查看其输出函数





2.2、调用动态库

动态库的调用分为静态调用和动态调用。

2.2.1、动态库的静态调用方式

静态调用方式调用动态库时需要以下要件:

Ø 动态库头文件

Ø 动态库lib

Ø 动态库dll



libtest.cpp需要如下步骤:

Ø 包含动态库头文件

Ø #pragma comment(lib,”dynamiclib.lib”)

Ø 将动态库dll放到libtest.exe统一目录下。



libtest.cpp



#include "staticlib.h"

#include "dynamiclib.h"

#pragmacomment(lib,"dynamiclib.lib")



int dynamicTest()

{

printf("dynamiclib test\n");

inta = 1, b = 2, c = 0;

c= Multi(a , b);

printf("%d\n",c);

return0;

}

int main(int argc, char* argv[])

{

dynamicTest();

return0;

}









2.2.2、动态库的动态调用方式

动态库的动态调用需要以下要件:

Ø 动态库dll



libtest.cpp

typedef int(*lpMulti)(int, int); //definefunction pointer type

int dynamicTestDynamicInvoke()

{

HINSTANCEhDll; //DLL handle

lpMultiMultip; //funciton pointer

hDll= LoadLibrary("dynamiclib.dll");

if(hDll != NULL)

{

Multip= (lpMulti)GetProcAddress(hDll, "Multi");

if(Multip != NULL)

{

intresult = Multip(2, 3);

printf("%d",result);

}

FreeLibrary(hDll);

}

return0;

}













3、动态库与静态库调用区别

静态库调用
动态库调用
动态调用

静态调用

库头文件

需要

不需要

需要

Dll

不需要

需要

需要

Lib文件

需要

不需要

需要

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: