首页新闻找找看学习计划

Windows核心编程“DLL的所有源文件都应该包含这个头文件”的一点疑惑

0
悬赏园豆:10 [已解决问题] 解决于 2019-05-23 12:03

原文如下:
“在创建DLL的时候,我们应该首先创建一个头文件来包含想要导出的变量(类型和名称)和函数(原型和名称),这个头文件还必须定义导出的函数或变量所用到的任何符号和数据结构,DLL的所有源文件都应该包含这个头文件”

主要是最后一句话:“DLL的所有源文件都应该包含这个头文件”不太理解

我在使用dll文件时(静态链接使用#pragma comment)会使用到h文件、lib文件、dll文件

按照上面最后一句话的意思,在生成dll文件时,源文件中应该是这个样子

但是我之前导出dll文件时,都是下面这样

现在不理解的是 DLL的源文件包含这个头文件有什么意义吗?(因为之前一直没有在生成dll时,#include头文件)

头文件dll.h的内容如下

#pragma once
#ifdef DLL_EXPORTS
#define DLL _declspec(dllexport)

#else
#define DLL _declspec(dllimport)

#endif

#ifdef _cplusplus
extern "C"
{
#endif

    DLL int sum(int a, int b);

#ifdef _cplusplus
}
#endif

望指教

蓝海人的主页 蓝海人 | 初学一级 | 园豆:52
提问于:2019-05-21 22:47
< >
分享
最佳答案
0

pragma once

编译的约定,防止重复导入头文件,造成重复定义的问题,和#ifndef ### #define ### ...一样的效果

ifdef DLL_EXPORTS

define DLL _declspec(dllexport)

else

define DLL _declspec(dllimport)

endif

这段表示是输入头定义还是实现,定义了这个DLL的宏
dllexport表示当前工程需要实现这个定义,自然需要链接的代码
dllimport表示要引入别的库,那头文件就是这个
_declspec这是API的二进制调用约定,可查下__stdcall、__cdecl和__fastcall是三种函数调用协议

ifdef _cplusplus
extern "C"
{

endif

//这个是区分C和C++编译器用的,加上extern "C",编译的结果函数就按照c的约定,否则会按照c++的约定出现修饰,
这样C语言代码引用这些库的时候就会出现找不到符号定义的问题

DLL int sum(int a, int b);

//函数的定义了

ifdef _cplusplus
}

endif

“DLL的所有源文件都应该包含这个头文件” 这句话没啥特别含义,只要知道我要使用别的库,自然需要头文件和库文件就够了

收获园豆:10
2012 | 专家六级 |园豆:18932 | 2019-05-23 09:07

这句话真的没啥特别含义吗······虽然到现在也没搞清楚在生成dll时#include头文件有什么意义

感谢指教

蓝海人 | 园豆:52 (初学一级) | 2019-05-23 09:44

@蓝海人:
简单点说,你把extern "C" 和DLL int sum(int a, int b);直接放到cpp文件中编译出dll也是一样的
别人使用这个库时,那还需要定义这些头

所以你定义一个通用的头文件,使用者和提供者共享不就可以了

2012 | 园豆:18932 (专家六级) | 2019-05-23 11:36

@2012: 感谢解答

蓝海人 | 园豆:52 (初学一级) | 2019-05-23 12:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册