【问题标题】:Exporting global functions from multiple projects in Windows DLL?从 Windows DLL 中的多个项目导出全局函数?
【发布时间】:2014-06-23 08:56:52
【问题描述】:

我有一个类似的设置,如下所述:

项目 A

  • Windows DLL
  • 取决于 项目 B

项目 B

  • 编译为静态库

现在,如果是全局函数,例如createNewFooProject B 中编译,它永远不会导出到最终的 DLL 中,尽管它是用 dllexport 声明的,并且最终的应用程序将它用作 dllimport

namespace example
{
class __declspec(dllexport) Foo
{
  Foo();
};

__declspec(dllexport) Foo* createNewFoo();

}

}

请注意,Foo 类总是导出到最终的 DLL 中,它唯一的全局或静态函数以某种方式被丢弃。

此外,请注意,如果在 Project A 而不是 Project B 中编译相同的全局函数,则始终会导出它。

Visual Studio 2010 中是否有任何设置允许从依赖项目中导出全局或静态函数?或者这是工具的限制?

【问题讨论】:

  • 静态库不需要dllexport,只需要在项目A中包含项目B的h和lib
  • 这正是我做的,项目B的header包含在项目A中,项目B的lib静态链接在项目A中。
  • 对于静态库,表示B的所有函数都导入到DLL A中。
  • 如果您尝试从 .dll 外部调用该函数,会出现什么错误? + 你能从 .dll 本身调用它吗?
  • 是的,该函数可以在 DLL 内部使用,但不能从外部 DLL 或应用程序中使用。我收到以下链接器错误:未解析的外部符号 __declspec(dllimport) 类示例::Foo * __cdecl 示例::createNewFoo(void)"

标签: c++ visual-studio-2010 dllexport


【解决方案1】:

使用静态库是重用代码的好方法。您无需在每个需要该功能的应用程序中重新实现相同的例程,而是将它们一次写入静态库,然后从应用程序中引用它。从静态库链接的代码成为您应用程序的一部分——您无需安装其他文件即可使用该代码。

根据你的情况,Lib B的函数被链接并成为DLL A的一部分,如果你想在DLL A中导出这些函数,你应该明确在DLL A中dllexport函数,并且在函数体中,可以调用 Lib B 的函数来复用代码。

【讨论】:

  • 函数在Project A中通过包含相同的头文件显式声明为dllexport。
  • 你还应该在 Project A 中实现 createNewFoo() 函数体
  • 感谢您的建议。在 Project A 中实现 createNewFoo 也有帮助。但是,我想知道为什么它没有在DLL中导出,而类Foo是?
  • 如果你声明一个带有dllexport属性的函数或对象,它的定义必须出现在同一个程序的某个模块中。否则,会生成链接器错误。 msdn.microsoft.com/en-us/library/twa2aw10.aspx
  • 定义存在于项目B中,编译为项目A的模块?为什么我必须将定义移动到项目 A?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2018-03-20
  • 2020-08-07
相关资源
最近更新 更多