0

私は休眠中のオープンソース プロジェクトを復活させるチームの一員です。私が最初にしたことの 1 つは、Windows 上の Visual C++ でビルドするようにソフトウェアを修正することでした。今後のリリースで MSVC バージョンを配布する予定です。

現在の DLL は__stdcall、説明できない理由から、呼び出し規則を使用してビルドされています。大したことではありませんが、これも MinGW でビルドされており、MinGW と Visual C++ が何__stdcallを意味するかについて意見が一致していません。詳細はこちらを参照してください。基本的に、MinGW は のように名前をマングルFunction@nし、MSVC は のようにマングルし_Function@nます。__stdcallDLLで使用しないのは正当な理由です...

への切り替え__stdcallは以前のメンテナにとって十分に重要であり、切り替えたときに (ABI 互換性を壊したため) メジャー バージョン番号を変更しました__cdecl

基本的に、MinGW のように、何らかのエイリアスを使用するか、名前を変更するだけで、DLL 内のシンボルを装飾するように MSVC を説得する必要があります。スイート内の他のソフトウェアは簡単に再構築して 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 に答える