因为我用C ++编程了一段时间,所以整个导出/导入的想法从我的脑海中消失了。
你能解释一下为什么要使用__declspec(dllexport)&如果看起来我可以使用其他库中没有这些类的类,那就导入thingy。
我在VC ++ 2005中创建了一个解决方案,添加了控制台应用程序项目和两个dll库项目。然后在LibB项目的LibA,ClassB中创建ClassA。
一旦我加入了ClassA.h& ClassB.h进入我的控制台应用程序源代码,并将其与LibA.lib和LibB.lib链接。我能够在控制台应用程序中创建和使用ClassA和ClassB的实例。所以基本上我能够使用类而不使用__declspec导出/导入它们。
你能解释一下 - 我在这里缺少什么。
答案 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