【一】静态导入导出
1.1 导出
1.1.1 __declspec(dllexport)关键字
在你需要导出的数据或者函数前使用__declspec(dllexport)
eg: __declspec(dllexport) int WoYaoDaoChu(int num){return num;} //ok 这个函数就是这个dll的导出函数了。
eg: class __declspec(dllexport) WoYaoDaoChu{}; //导出类的所有公共成员和函数
可以导出的东西包括 数据,函数,类,类成员函数(这句话也不尽对,特别是当类如C要导入你的dll时,具体暂时我说不清楚,这里留个标记)
__declspec(dllexport)被编译器编译时识别,在编译器生成.OBJ文件时会额外加入导出信息。链接器会在链接时获取并处理这些信息。
链接器通过这些信息生成.LIB文件。链接器在生成的DLL文件中添加导出符号表(字母顺序排列,添加RVA(相对虚拟地址)。
导出符号表和RVA都在生成的DLL中。
1.1.2 .def文件(模块定义文件)
这样就不需要在要导出的东西(数据,函数,类,类成员)前些__declspec(dllexport)关键字了。
如果使用VS,IDE。可以在项目-属性-链接器-输入中修改该项目使用的DEF文件。
MSDN摘抄,免得辛苦再找(模块定义语句规则)
语句、属性关键字和用户指定的标识符区分大小写。包含空格或分号 (;) 的长文件名必须用引号 (") 引起。
使用一个或多个空格、制表符或换行符,将语句关键字同其参数分开和将各语句分开。指定参数的冒号 (:) 或等号 (=) 两旁有零个或多个空格、制表符或换行符。
如果使用 NAME 或 LIBRARY 语句,则这些语句必须位于所有其他语句之前。
在 .def 文件中,SECTIONS 和 EXPORTS 语句可以出现多次。每个语句都可以采用多个规范,各规范间必须用一个或多个空格、制表符或换行符分开。语句关键字必须在第一个规范的前面出现一次,并且可以在每个附加规范的前面重复。
许多语句都具有等效的 LINK 命令行选项。有关其他详细信息,请参见相应的 LINK 选项说明。
.def 文件中的注释由每个注释行开始处的分号 (;) 指定。注释不能与语句共享一行,但可以在多行语句的规范间出现。((SECTIONS 和 EXPORTS 为多行语句。)
以十进制或十六进制为基础指定数值参数。
如果字符串参数与保留字匹配,则必须用双引号 (") 将字符串参数引起。
1.2 导入
1.2.1 __declspec(dllimport)关键字
在你需要导入dll的项目中 用 __declspec(dllimport) 声明导入对象
eg: __declspec(dllimport) int WoYaoDaoRu(int);
eg:class __declspec(dllimport) ClassName{
public:
void Fun1(); //要写出你要引用的函数
};