2013-02-26 57 views
0

我是恢复休眠的开源项目的一个团队的一部分。我做的第一件事就是修复在Windows上使用Visual C++构建软件。该计划是在即将发布的版本中分发MSVC版本。设置一个MSVC DLL,以便与ABI兼容的__stdcall MinGW DLL

由于我无法解释的原因,当前的DLL使用__stdcall调用约定来构建。没什么大不了的,除了它也是用MinGW和MinGW和Visual C++对__stdcall的含义不同意的。详情请参阅here,但基本上MinGW将像[email protected]这样的名字弄得乱七八糟,而MSVC就像[email protected]一样。这是一个很好的理由不使用你的DLL __stdcall ...

改用__stdcall是,他们碰到一个主版本号先前的维护者足够重要(因为它打破ABI兼容性),当他们切换到它,我我不愿意再次碰撞回到__cdecl

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

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

所以这里的问题是否有任何自动化或大多数自动化的方式来做到这一点?

+0

号只有DEF文件可以重命名出口。创建导入库时,实际导出的名称应该永不重要。 – 2013-02-26 05:38:37

+0

这就是我的想法。我试图自动创建该.DEF文件,或者至少大部分是自动创建.DEF文件。我的问题是,我试图提供一个DLL,它可以与已经链接到以前版本的导入库的现有代码一起工作。 – Robert 2013-02-26 05:43:13

+0

因此,将其与新的导入库链接。这是导入库的要点。 – 2013-02-26 05:45:33

回答

0

我能够写一个简单的Python脚本来做到这一点。我不知道是否有更简单的方法,但这适用于我

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

[email protected] 
[email protected][email protected] 

脚本:

#!/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))