【问题标题】:Can I build executable as dll?我可以将可执行文件构建为 dll 吗?
【发布时间】:2013-12-30 17:55:11
【问题描述】:

我需要创建一个 dll,其中包含我在 Visual Studio 2010 中的可执行项目中的内容。我意识到我可以在项目属性 >> 常规 >> '配置类型中更改项目配置,而不是创建一个 dll 项目' 到 'dll' 并且它构建得很好。它创建 dll。我添加了一个额外的 .h/.cpp 文件,其中包含我想要在 dll 中的导出功能。

我首先担心的是这是一个合法的 dll 吗?我正在尝试使用 LoadLibrary() 加载它,但我得到错误代码 126(找不到指定的模块),尽管 dll 在项目目录中(与可执行文件相同)。我只是想知道它是否与出于任何原因它可能不是完全合格的 dll 的事实有关?我的exe项目是MFC项目。

** 更新 **

感谢 cmets,我现在可以成功加载 dll - 这是依赖项问题。但是GetProcAddress() 不会为导出函数返回有效指针。 dumpbin /exports 实用程序显示 dll 没有导出功能!

所以我现在只将 .h/cpp 文件添加到具有简单虚拟导出功能的原始项目中。

__declspec(dllexport) int MakeDouble(int value);

为了以防万一,我还在应用程序类中包含了头文件。我想知道为什么这个函数不显示为导出?我该怎么办?

【问题讨论】:

  • 它可能是一个合法的 DLL,但它是否有你想要的东西,或者它是否使用与你的其他项目相同的工具链,都是有待商榷的。你可以试试dumpbin /exports <nameofdll>
  • 126 可能来自缺少的依赖项。看到那个答案:stackoverflow.com/a/14362289/1374704
  • @manuell 确实有其他依赖,好建议!
  • @manuell 说了什么。 depends.exe 是你的朋友!
  • 当心 C++ 名称装饰!也许你想将函数声明为__declspec(dllexport) extern "C"

标签: c++ visual-studio-2010 dll mfc exe


【解决方案1】:

第一:

__declspec(dllexport) int MakeDouble(int value);

函数声明应该与定义具有相同的签名,当然,函数必须有一个定义(简单的return 0;应该可以工作}

第二:

导出的函数名用漂亮的奇怪字符装饰,你应该使用 extern "C"(或 MS 特定的 stdcall + .def 文件)。:

//.h
extern "C" __declspec(dllexport) int MakeDouble(int value);

//.cpp
extern "C" __declspec(dllexport) int MakeDouble(int value) {
    return 0;
}

您还应该在项目属性中检查该选项:

Configuration Properties -> C/C++ -> Code Generation -> Runtime Library

确保值包含单词DLL

【讨论】:

  • 谢谢,做到了。我的错误是函数没有在 cpp 文件中用 __declspec(dllexport) 声明
猜你喜欢
  • 2023-03-21
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
相关资源
最近更新 更多