gpt4 book ai didi

c++ - 如何在 Visual Studio 2010 中使用 DEF 文件从现有 C++ 代码生成 DLL

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:48 24 4
gpt4 key购买 nike

我继承了一个 C++ 项目,我需要将它转换成一个 DLL,以便在其他项目中使用它。

代码在 Visual Studio 2010 解决方案中构建。我能够编译它并生成一个 DLL 文件,但没有关联的 lib 文件。我不是Windows开发者,但是好像需要导出我想要使用的函数,有两种方式:

第一个选项意味着在我要导出的每个类或函数前面手动添加 __declspec(ddlexport)。由于有很多类,而且我无法控制要链接到库的所有应用程序,因此第二个选项(DEF 文件)看起来更有希望。

有没有办法从现有的 DLL 文件生成 DEF 文件?我尝试了不同的解决方案:

  • 使用expdef .它只是崩溃,没有任何信息。
  • 使用 dumpbin .我没有看到函数名称。就是这样:

    文件类型:DLL

    总结

        1000 .data
    2000 .idata
    18000 .rdata
    5000 .reloc
    1000 .rsrc
    98000 .text
    48000 .textbss

仅此而已。我想这意味着我没有导出任何东西。但是,这正是我想要做的。我该怎么做?

最佳答案

几年来反复遇到这个问题后,我今天找到了解决方案。这有点 hacky,但它实际上可能是使用 Visual Studio 的最佳方式。

由于您不想导出所有可能的符号(特别是因为您的 DLL 本身可能包含大型静态库),并且您无法使用您希望可用的符号来编辑文件(对我来说,这是因为它们是必须静态链接以遵循其使用模式的第 3 方库),而 DEF 是最佳解决方案。

如果我们有:

  • 应用程序(EXE)
  • 库 (DLL)
  • 库有 .DEF 文件,这意味着当您构建时,.DEF 中列出的符号将导出到库 .DLL 并列在 .LIB 文件中。
  • .DEF 文件为空
  • 申请链接图书馆的LIB文件

现在构建!

好的,我们遇到了很多链接器错误... Linker errors

现在转到“输出”选项卡,注意输出文本中每个链接器错误行末尾的符号名称:

Linker error text

我们可以创建一个小脚本,获取每一行的最后一个“单词”,去掉括号,然后将其放入您的 DEF 文件中。并且有效!

就像我说的那样,它有点老套(因为您最终只得到应用程序当时使用的符号)。但实际上,由于您不想导出所有内容,并且您可能需要该库静态链接的库中的符号,因此这可能是最准确的方法。

(注意:在我的例子中,这主要是试图让插件 DLL 访问应用程序 EXE 中的符号的问题)

关于c++ - 如何在 Visual Studio 2010 中使用 DEF 文件从现有 C++ 代码生成 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21433424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com