查看dll相关资料时,如DLL入门浅析(1)——如何建立DLL点击打开链接,老是发现#include “stdafx.h”这个东东,自己照搬里面步骤一写就报错,“……no such file”,后来发现在新建控制台项目时选择静态库时会自动生成stdafx.h,而选择DLL是没有这个文件的,那么究竟是干什么的呢?发现了预编译头文件这个讲的还可以,相当于把会用到的头文件都放到这个“stdafx.h”里面include,其它cpp只需#include “stdafx.h”即可,然后程序会生成一个pch文件,之后的编译就没必要重新编译头文件,而直接用这个,省时间。
照猫画虎,写的一些dll,测试通过,使用dll开发编译时如果采用启动时加载还是需要lib、dll、h文件的,cpp不用。说是采用运行时动态加载不需lib文件,只需dll和h文件,没试。开发完只需执行文件和dll,没有dll是没法运行的。
注意,很多解释在代码注释里。
dll的头文件,声明导出函数:
#ifndef _BIG_NUM_MARH_DLL_H // 好的编程习惯,避免重复编译。
#define _BIG_NUM_MARH_DLL_H
// 通过宏来控制是导入还是导出,这个有意思,在要export的cpp里定义DLL_BIG_NUM_E,在使用dll的地方不用管。
#ifdef DLL_BIG_NUM_E
#define DLL_BIG_NUM_MATH _declspec(dllexport)
#else
#define DLL_BIG_NUM_MATH _declspec(dllimport)
#endif
/*
extern,表示此函数是外部函数。C语言规定,如果在定义时省略extern,则隐含为外部函数。而内部函数必须在前面加static关键字。在需要调用此函数的文件中,用extern对函数作声明,表明该函数是在其它文件中定义的外部函数。
”C”的含义:我们都知道C++通过函数参数的不同类型支持重载机制,编译器根据参数为每个重载函数产生不同的内部标识符;但是,如果遇到了C++程序要调用已经被编译后的C函数,那该怎么办呢?比如上面的int Add(int a,int b)函数。该函数被C编译器后在库中的名字为_Add,而C++编译器则会生成像_Add_int_int之类的名字用来支持函数重载和类型安全。由于编译后的名字不同,C++程序不能直接调用C函数,所以C++提供了一个C连接交换指定符号extern “C”来解决这个问题;所以,在上面的DLL中,Add函数的声明格式为:extern “C” EXPORTS_DEMO int Add (int a , int b)。这样就告诉了C++编译器,函数Add是个C连接的函数,应该到库中找名字_Add,而不是找_Add_int_int。
*/
//编译C++程序时,编译器自动定义了一个预处理器名字__cplusplus(前面是两个下划线)。因此,我们可
//以根据它来判断该程序是否是 C++ 程序,以便有条件的包含一些代码。
#ifdef _cplusplu