静态连接库与动态链接库
2011-10-13 19:22
155 查看
静态链接库(简称静态库)和动态连接库(简称动态库)在windows编程过程中经常碰到,很多人都在用,如果详细追究也没几个人能说的清楚。自己以前看过多次,每次看都不是很完整,看过之后不久也就忘记了。希望通过这次总结可以加深印象,提升对库的理解,本文章所用vs为vc6.0。
(1) 在工程属性中设置,如下图
Ø 需要在debug和release时都添加lib库,当然也可以选择”SettingsFor”->”All Configurations”来添加lib库。
Ø 当工作区文件丢失后,添加的lib库文件名即丢失。
(2) 用#pragma预处理命令。
Ø #pragma comment(lib, "iphlpapi.lib")
Ø 可以在文件中直观的看到用到哪些lib库
Ø 当vc工作区文件(dsw)丢失时,重建dsw文件即可编译。
Ø 不需要debug和release都添加库文件名。
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
Ø 头文件
Ø 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”)来指定。
动态链接库只有输出函数或数据才有意义,输出函数方法有两种:
Ø 用_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不能查看其输出函数
Ø 动态库头文件
Ø 动态库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;
}
Ø 动态库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;
}
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文件 | 需要 | 不需要 | 需要 |
相关文章推荐
- linux 动态链接库的创建和使用--静态连接
- 静态连接库与动态链接库
- 静态连接库与动态链接库
- 静态连接库、动态链接库
- 静态连接库和动态链接库的区别
- Mac 开发笔记(一):动态链接库与静态连接库
- 静态连接库和动态链接库实例
- gcc调试中使用静态连接库和动态链接库以及-I -l L含义
- 动态链接库dll和静态连接库lib的区别
- 静态连接库和动态链接库
- (转)静态连接库与动态链接库
- 静态连接总结
- 在Symbian开发环境下如何编写静态接口DLL(动态链接库)
- 静态连接库、动态连接库、和com组件 (ZZ)
- Linux环境下编写静态和动态链接库
- 静态库编译及连接l
- QT程序探测所需DLL,静态连接和打包
- Linux静态和动态链接库使用实例
- [转]Ubuntu 命令行模式下配置静态网络连接
- vs2008 静态连接生成一个exe