LoginSignup
4
4

More than 5 years have passed since last update.

x64用のdllファイルからインポートライブラリ(.lib)を生成

Posted at

概要

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4