【问题标题】:Set up a MSVC DLL to be ABI-compatible to a __stdcall MinGW DLL将 MSVC DLL 设置为与 __stdcall MinGW DLL ABI 兼容
【发布时间】:2013-02-26 05:33:16
【问题描述】:

我是一个恢复休眠开源项目的团队的一员。我做的第一件事就是修复软件以在 Windows 上使用 Visual C++ 构建。计划是在即将发布的版本中分发 MSVC 版本。

当前的 DLL 是使用 __stdcall 调用约定构建的,原因我无法解释。没什么大不了的,除了它也是用 MinGW 构建的,MinGW 和 Visual C++ 不同意 __stdcall 的含义。有关详细信息,请参阅here,但基本上 MinGW 会像 Function@n 一样破坏名称,而 MSVC 会像 _Function@n 一样破坏它。最好不要在 DLL 中使用 __stdcall...

切换到__stdcall 对以前的维护者来说非常重要,以至于他们在切换到它时撞了一个主要版本号(因为它破坏了 ABI 兼容性),我不愿意再次撞它以切换回 @987654328 @。

基本上,我需要说服 MSVC 像 MinGW 那样装饰 DLL 中的符号,或者使用某种别名,或者只是更改名称。我不在乎哪个,因为套件中的其他软件可以很容易地重新构建以调用 DLL,但是需要 - 这是我担心的现有软件。

我怀疑我需要一个 .DEF 文件,但我不愿意手工制作。有几十个导出函数。

那么问题来了 - 是否有任何自动化或大部分自动化的方法可以做到这一点?

【问题讨论】:

  • 没有。只有 .def 文件可以重命名导出。创建导入库时,实际导出的名称应该无关紧要。
  • 我就是这么想的。我正在尝试自动制作该 .DEF 文件,或者至少大部分是自动制作。我的问题是我正在尝试提供一个 DLL,该 DLL 将与已经链接到先前版本的导入库的现有代码一起使用。
  • 所以将它与新的导入库链接。这是导入库的重点。
  • 我正在尝试提供一个库,该库将与用户已经使用旧 DLL 的现有应用程序一起使用,并且我无法控制也无法更改。或者你是说我可以通过新的导入库以某种方式做到这一点?

标签: visual-c++ dll mingw dllexport


【解决方案1】:

我能够编写一个简单的 Python 脚本来执行此操作。我不知道是否有更简单的方法,但这对我有用

您需要pexports(链接自here),并且可以使用pexports mylib.dll > mylib-stock.def 在您的DLL 上运行它。然后使用fixdefs.py mylib-stock.def mylib.def 运行此 Python 脚本,并在构建库时包含该脚本。似乎工作正常。你会得到一个像这样的文件:

_Function@n
Function@n=_Function@n

脚本:

#!/usr/bin/env python
from sys import argv

def fixline(line):
    if line.startswith('_'):
        line=line.strip()
        return "%s\n%s=%s\n" % (line, line[1:], line)
    return line

if __name__=="__main__":
    if len(argv)!=3:
        print "usage %s <input.def> <output.def>" % argv[0]
        exit(1)

    with open(argv[1], 'r') as input:
        with open(argv[2], 'w') as output:
            for line in input:
            output.write(fixline(line))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多