3 Nov 2014

MinGW-w64.GCCでビルドしたDLLのMSVC用インポートライブラリを作る

MinGWなGCCで作ったライブラリをMSVCで使いたい時,特にsharedなライブラリをリンクする時どうするかのメモ.

とりあえずdefファイルが欲しい.
gccでDLLを作る時に--output-def,dllname.defを渡せばdefを作ってくれるのでMakefileとか弄ったほうが早い場合はそれで出力する.
ただしgccが吐くdefファイルはMSVCのlib.exeでインポートライブラリを作る時にちと都合がわるいので
sed -i "s/ @[^ ]*//"  dllname.def
で前処理しておく.
Makefileいじるのとか面倒な時やもう既にビルドしてしまった時はMinGW-w64-toolsに含まれているgendefを使って
gendef dllname.dll
若しくは
gendef - dllname.dll > dllname.def
としてdefファイルを作る.上の場合dllname.defが生成される.下の場合リダイレクトで好きな名前のファイルとして作れる.
gendefで作ったdefファイルはsedでの処理は必要ない.
後は出来たdefファイルとDLLを使って
lib.exe -machine:ARCH -def:dllname.def -out:name.lib
でMSVC用のインポートライブラリname.libが出力される.
この時dllname.def内に
LIBRARY "hoge.dll"
とあればname.libはhoge.dllに対するインポートライブラリ,なければdefファイル名のdllname.dllに対するインポートライブラリとなる.
gccで出力した場合はLIBRARYは記述されないので自分で書くかdefファイルがDLLと同じ名前になるようにする必要がある.
gendefはLIBRARYが書かれるため特にファイル名は気にしなくても良い.
*.libがどのDLLに対するものか自信がなければstringsとgrepで確認すれば良い.
また,ARCHは32bitの場合i386,64bitの場合x64を渡す.

以上.

ちなみにffmpegはconfigure時にPATHにlib.exeがあると自動的に上記の過程を実行しDLLをビルドした際はMSVC用のインポートライブラリ (*.lib) を作ってくれる.
lib.exeが無い場合に作られるのはdlltoolを用いて作られるものである.
これがMSVCと混ぜて使う時にどれほどの互換性があるかはよく知らない.

なぜこれを書いたかというとLSMASHSource.dllをsharedでビルドしているのだがその時にliblsmashに対して上記の作業をしているからである.(patch当てているので毎回手作業でやっているわけではない)

3 comments:

  1. Hello,
    Sorry to bother you but I was wondering if you were still making x264 patched builds?
    And if not is it possible to share the patches you used because I'm not really satisfied with the kmod nor tmod patched versions and sadly I can't find a patched version as good as yours were on google. ;.;

    ReplyDelete