概要
dllをvcのdumpbinを使い関数名を取得
その関数名からdefファイルを作成してvcのlibを使いインポートライブラリ化を行います。
使い方
VisualStudio2013が必要です。2012とか2015の方はmakelib.batのVS_BIN辺りを書き換えればいけるはずです。
下のコードをコピペってbatとshファイル作成
makelib.batに対して 第一引数にdllがあるフォルダ、第二引数にlibの出力先を指定して実行すればlibの出力先に指定したパスにlibが生成されます。
makelib.bat
@echo off
rem ------------------------------------
rem infomation
rem batの説明を記載
rem ------------------------------------
rem setting
rem 各種設定
set CurDir=%~dp0
set VS_BIN=%VS120COMNTOOLS%..\..\VC\bin\
set DUMPBIN_EXE="%VS_BIN%dumpbin.exe"
set LIB_EXE="%VS_BIN%lib.exe"
set MAKEDEF_SH=%CurDir%makedef.sh
set InputDir=%1
set OutputDir=%2
call :CLEAR_SCREEN
echo %InputDir%
echo %OutputDir%
rem ------------------------------------
rem 実装部
:EXEC
for /f "usebackq" %%f in (`dir /b /s %InputDir%\*.dll`) do (
echo MakeLib [%%f,%%~nf.lib]
rem dumpファイル作成
%DUMPBIN_EXE% /EXPORTS %%f > %%~nf.txt
rem dumpファイルからdefファイルを作成
bash %MAKEDEF_SH% %%~nf.txt
rem defファイルからlibファイルを生成
%LIB_EXE% /DEF:%%~nf.def /MACHINE:X64 /out:%OutputDir%\%%~nf.lib
rem 不必要になったゴミの削除
del %%~nf.txt
del %%~nf.def
del %OutputDir%\*.exp
)
rem ------------------------------------
rem 終了処理
:END
:: /B 呼び出し元へ戻る
exit /B
rem ------------------------------------
rem ログ消去
:CLEAR_SCREEN
cls
exit /B
rem ------------------------------------
rem EOF
makelib.sh
# ! /bin/sh
# -----------------------------------------------------------------------------
# infomation
# 渡されたファイルを元にdefファイルを作成します
# グローバル変数 :全部大文字
# ローカル変数 :LCC (hoge,foo,hogeRoot,fooDir)
# 終端/ :Root
# 終端 :Dir
# 関数 :先頭f (fPoo)
# -----------------------------------------------------------------------------
# setting
CurDir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)
TempDir=$(mktemp -d)
# -----------------------------------------------------------------------------
# [function] 画面消去
function fClearScreen() {
# cygwin
cmd /c cls
# linux
# clear
}
# -----------------------------------------------------------------------------
# exec
# set -eux
OutputFile=${1%.*}.def
echo EXPORTS > $OutputFile
isExport=0
while read line ; do
# 比較しやすいようにスペースを取り除いたものを用意する
t=`echo $line | sed -e "s/\s//g"`
if [ $isExport -eq 1 ] ; then
if [ "$line" = "Summary" ]; then
isExport=0
else
val=`echo $line | sed -e "s/.*\s\(.*\)$/\1/g"`
if [ -n "$val" ]; then
echo " $val" >> $OutputFile
fi
fi
fi
if [ "$t" = "ordinalhintRVAname" ] ; then
isExport=1
fi
done < $1
# set +eux
# -----------------------------------------------------------------------------
# trap
trap "rm -fd $TempDir" 0
# -----------------------------------------------------------------------------
# end
echo "Finished"
# EOF