预编译头文件和dll相关

本文介绍了预编译头文件的概念,它用于包含常用头文件以提高编译效率,例如在“stdafx.h”中包含所需头文件。创建静态库时会自动生成此文件,但DLL项目则不会。在DLL开发中,静态加载需要lib、dll、h文件,而动态加载可能仅需dll和h文件。文章提供了DLL的头文件和导出函数示例,并提到使用DLL时的注意事项,包括def模块定义文件的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       查看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 _cplusplus		// 这个有点不明白,难道c++编译器里自动有这个宏定义?
e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值