关闭

windows下 静态/动态库的一些总结

163人阅读 评论(0) 收藏 举报
分类:
静态库:
静态库比较简单
制作静态库:
用C语言时只用一个.c文件就可以了(使用.c默认使用的是C语言的编译器),由于C编译器的缘故,不用提供头文件。使用库时只用#pragma comment(lib,"相对path") 就可以了使用了。
C++使用时也就是后缀名为.cpp时,就必须在使用的时候提供声明。所以制作静态库时也需要一个头文件。写关于函数或类的声明。同样,在使用库时也需要#pragma包含进库。(当然也可以通过编译器的设置也包含静态库)

动态库:
动态库较静态库有不少优点,但缺点就是制作和使用比较复杂
制作动态库:
写完库程序代码后,还需要将一部分信息导出到.dll文件头。导出有两种方式,一种生成.lib文件(函数名也被 改),一种不生成(函数名不会被改)。
1>声明导出:(生成.lib文件)
_declspec(dllexport)func_name(...);
2>模块定义文件导出(.def文件)
LIBRARY file_name
EXPORTS
func_name @1
...
动态库的使用:
动态库使用时最好将其与应用程序放入同一个目录里。
使用也有两种方式:
1>隐式链接
(extern "C") _declspec(dllimport)func_name(...);//这个如果是CPP库的话可以用#include "x.h"包含来代替
#pragma comment (lib,"相对path")//由于用到.lib库,所以导出方式应为声明导出
前面的extern "C"是如果使用C语言的动态库时加的
2>显式链接
定义函数指针类型typedef
加载动态库LoadLibrary(LPCTSTR lpFileName)
获取函数地址FARPROC GetProAddress(HMODULE hModule,lpProcName)
//这里lpProcName必须与.dll文件头中的函数名字一致,声明导出的话会改变函数的名字,所以使用前最好用工具看一看.dll文件的头是否将函数换名,如果换名,此处也得是那个名字。如果是.def文件导出就不会换名。
通过函数指针使用函数。
卸载动态库
FreeLibrary(HMODULE hModule)
动态库程序也有main函数,是在load和free的时候调用的
>示例(使用class做库)
.h
#ifndef XXX.H
#define XXX.H

#ifdef EXPORT
#define DLL _declspec(dllexport)
#else
#define DLL _declspec(dllimport)
#endif
class DLL CMath
{
public:
int add(int ,int );
};

#endif
.cpp
#define EXPORT
#include ".h"
int CMath::add(int a, int b){}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:17461次
    • 积分:276
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:15篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论