c++ - 为什么要使用 __declspec(dllexport)?似乎在没有它的情况下工作

标签 c++ visual-c++ visual-studio-2005

自从我用 C++ 编程以来已经有一段时间了,所以整个导出/导入的想法从我脑海中溜走了。

你能解释一下为什么要使用 __declspec(dllexport) & import thingy 如果看起来我可以使用其他库中的类而没有这些。

我在 VC++ 2005 中创建了一个解决方案,添加了控制台应用程序项目和两个 dll 库项目。然后在LibA中创建ClassA,在LibB项目中创建ClassB。

一旦我将 ClassA.h 和 ClassB.h 包含到我的控制台应用程序源代码中,并将它与 LibA.lib 和 LibB.lib 链接起来,我就能够在控制台应用程序中创建和使用 ClassA 和 ClassB 的实例.所以基本上我能够使用类而无需使用 __declspec 导出/导入它们。

你能解释一下吗 - 我在这里缺少什么。

最佳答案

Once I have included ClassA.h & ClassB.h into my console app source code, and has linked it with a LibA.lib and LibB.lib I was able to create and use instances of ClassA and ClassB in a console applicaiton.

这听起来像是您使用了静态链接。这在没有 __declspec(dllexport) 的情况下以与直接链接类的目标文件相同的方式工作。

如果您想使用 DLL 的动态(运行时)链接,您必须使用上述声明或指定导出函数的 DEF 文件。 DLL 包含一个导出表,其中列出了暴露给其他可执行文件的函数。所有其他函数都保留在您的 DLL 内部。

也许您对来自 Linux 世界的情况感到困惑,那里的情况恰恰相反:默认情况下,所有符号都在外部可见。

关于c++ - 为什么要使用 __declspec(dllexport)?似乎在没有它的情况下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641172/

相关文章:

c++ - 具有非虚拟方法的类中的 GMock 和模拟构造函数

visual-c++ - 如何判断一个 Visual Studio 项目文件是代表应用程序、DLL 还是静态库项目?

c# - 找不到 Dumpbin.exe

c++ - 为什么 Visual C++ 不对最琐碎的代码执行返回值优化?

c - 为什么我可以有冲突的函数原型(prototype)和同名定义?

ms-access - 如何获取表架构

c++ - 转到另一个语句的命令是什么?

c++ - 在 Visual Studio 中为 SFML 设置相对路径

c++ - ldap_modify 函数通过访问冲突?

c++ - ntdll.dll 中未处理的异常