为什么要使用__declspec(dllexport)?似乎没有它工作

时间:2009-10-29 01:36:13

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

因为我用C ++编程了一段时间,所以整个导出/导入的想法从我的脑海中消失了。

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

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

一旦我加入了ClassA.h& ClassB.h进入我的控制台应用程序源代码,并将其与LibA.lib和LibB.lib链接。我能够在控制台应用程序中创建和使用ClassA和ClassB的实例。所以基本上我能够使用类而不使用__declspec导出/导入它们。

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

3 个答案:

答案 0 :(得分:5)

  

一旦我加入了ClassA.h& ClassB.h进入我的控制台应用程序源代码,并将其与LibA.lib和LibB.lib链接。我能够在控制台应用程序中创建和使用ClassA和ClassB的实例。

这听起来像你使用过静态链接。这与__declspec(dllexport)的工作方式不同,就像直接链接到类的目标文件一样。

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

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

答案 1 :(得分:0)

如果你想在你的dll中提供符号供其他dll / exes访问,你可以使用__declspec(dllexport)。

如果你想访问另一个dll提供的dll / exe中的符号,你可以使用__declspec(dllimport)。

如果要链接静态.lib,则不需要。

答案 2 :(得分:0)

如果要包含.h文件并链接到.lib文件,则可以删除DLL声明。如果只需要静态链接,为什么还需要动态链接库?

导出声明将该功能标记为可用于导出。您正在使用的声明可能是“extern”和“pascal”的宏。自从我完成此操作已经多年了但我认为DLL函数调用具有在堆栈上推送params的不同顺序,并且返回结果的分配是完成不同(pascal标志)。 extern声明可以帮助链接器在链接库时使该函数可用。

您可能错过了链接DLL的步骤 - 链接器将使用classA.lib并将其转换为classA.dll(您可能需要设置setupA.def文件来定义DLL库)。同样适用于ClassB