背景

我是一个新手,我正在通过微软的官方指导学习如何在C++中构建和使用DLL. https://learn.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=msvc-170

我发现它使用一个头文件来判断是否存在某个宏(MATHLIBRARY_EXPORTS)来获得两个版本MATHLIBRARY_API宏定义.然后在DLL构建项目和客户端项目中使用此头文件.

我不知道宏(MATHLIBRARY_EXPORTS)的定义在哪里,我想try 使用"__declspec(Dllexport)"来构建一个DLL,所以我在Visual Studio中创建了两个项目进行测试.

问题

在DLL构建项目中,我只在头文件中的函数声明前使用了"dllexport",并成功构建了一个DLL.让我困惑的是,当我在客户端项目中包括这个头文件并给我一个正确的结果(在控制台中打印"Hello world")时,它可以工作. 这正常吗?为什么我不需要将函数声明为"dllimport",它就可以工作?header fileclient projectresult

推荐答案

来自DOC:Import into an application using __declspec(dllimport)

在函数声明中使用__declspec(dllimport)是可选的,但如果使用此关键字,编译器会生成更有效的代码.但是,您必须使用__declspec(dllimport)使导入的可执行文件访问DLL的公共数据符号和对象.请注意,DLL的用户仍然需要与导入库链接.

C++相关问答推荐

数组元素的编号索引

如何将匿名VLA分配给指针?

如何确保内存分配在地址附近?

如何避免使用相对路径包含在c中

为什么双重打印与C中的float具有不同的大小时具有相同的值?

正确的TCP/IP数据包 struct

向上强制转换C中的数值类型总是可逆的吗?

tick.q中的Kdb+键控表语法

C中的FREE函数正在触发断点

强制转换变量以在 struct 中蚕食

通过描述符查找文件路径时出现问题

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

Matlab/Octave对conv2函数使用哪种方法?

UpDown控制与预期相反

分支预测和UB(未定义的行为)

共享内存未授予父进程权限

struct 中的qsort,但排序后的 struct 很乱

可以从指针数组中的值初始化指针吗?

当 a 是代码块时使用逗号运算符 (a, b)

strlen 可以是[[未排序]]吗?