【问题标题】:Find the associated dll file to __declspec(dllexport)找到关联的dll文件到__declspec(dllexport)
【发布时间】:2016-02-18 17:24:50
【问题描述】:

我得到了这个庞大的项目,其中包含许多在 dll 文件中定义的类。我需要提取该项目的一部分并从该部分创建一个新项目。我已经设法通过使用 Visual Studio 中的 Code Map 找到了一些 dll 文件,但是那里没有显示一些类。

#   ifdef FCBase
#       define BaseExport  __declspec(dllexport)
#   else
#       define BaseExport  __declspec(dllimport)
#   endif

class BaseExport Handled
{.
 .
};

什么是指定哪些 dll 文件链接到什么?

【问题讨论】:

  • 链接器的附加依赖项设置。它也可以在带有#pragma 注释的源代码中完成。并且您总是可以使用 Dumpbin.exe /imports 从可执行文件本身中找出来
  • 问题是那个文件夹存储了 273 个 lib 文件,我只需要几个但我不知道如何找到它们。 Dumpbin.exe /imports 是如何工作的?你能给我一个链接吗?

标签: c++ dllimport dllexport declspec


【解决方案1】:

指令__declspec(dllexport) 表示使用该指令声明的任何内容都将从DLL 导出,以便在链接到该DLL 的其他应用程序中使用。因此,当为将被编译成 DLL 的代码编写头文件时,函数声明和类定义都使用该指令进行修饰。另一方面,将使用这些函数和类的代码需要使用__declspec(dllimport) 声明它们,以让链接器知道它们将从 DLL 导入。

这两个指令通常被一个宏替换,该宏会根据项目设置解析为适当的值。这样,您可以在 DLL 实现文件和将使用此 DLL 的其他应用程序的实现文件中包含相同的头文件。例如,在您的情况下,DLL 项目将定义FCBase,因此BaseExport 将在预处理步骤中解析为__declspec(dllexport)。这表明这个项目是为了实现 DLL。没有定义FCBase的项目,这意味着该项目正在从DLL中导入函数和类。

【讨论】:

  • 我能找到它是从哪个 DLL 导入的吗?
  • @Rasmus 不确定这个庞大的项目是如何组织起来的,它是一个包含多个 VS 项目的 VS 解决方案吗?无论如何,声明导出函数和类的头文件应该驻留在相应的 DLL 项目文件夹中(在文件系统上,而不是在 VS 解决方案资源管理器中)。这样,您可以确定某个函数或类是从哪个 DLL 导出的。
  • 是的,它是一个解决方案中的多个 vs 项目。这不是这个项目的组织方式。所有头文件都在一个文件夹中,所有DLL都在同一个bin文件夹中。
  • @Rasmus 然后您可以使用 Visual Studio 附带的 dumpbin 实用程序。对于 VS2015,它位于文件夹“C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin”中,但您可以通过打开 VS 命令提示符窗口直接访问它。使用示例:dumpbin.exe /EXPORTS dll_file.dll 这将打印有关 DLL 文件的一些详细信息和导出表(包含名称、序号、RVA...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2018-08-05
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
相关资源
最近更新 更多