0

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

当前的 DLL 是使用__stdcall调用约定构建的,原因我无法解释。没什么大不了的,除了它也是用 MinGW 构建的,MinGW 和 Visual C++ 不同意什么__stdcall意思。有关详细信息,请参见此处,但基本上 MinGW 将名称弄乱,Function@n而 MSVC 将其弄乱,例如_Function@n. 这是一个很好的理由不在__stdcall你的 DLL 中使用......

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

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

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

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

4

1 回答 1

0

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

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

_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))
于 2013-02-26T06:07:44.713 回答