您的位置:首页 > 编程语言

利用openssl管理证书及SSL编程第3部分:将MinGW编译的openssl dll导出def和lib供MSVC使用

2017-08-20 16:55 453 查看

将MinGW编译的openssl dll导出def和lib供MSVC使用

前面我们用mingw把openssl 编译成了动态库,得到以下2个dll文件:

libeay32.dll

ssleay32.dll

然后用以下的脚本生成Windows MSVC须要的模块定义文件(.def, .lib和.exp),

然后就能够在VC中使用了. 前提系统要安装VS.

系统要求:

Windows7+VS Studio (2008 and later)+MSYS

1) 依据32位dll生成模块定义文件的python代码:

#!/usr/bin/python
# filename: mklib32.py
#   -- Make 32bits windows module files from MinGW x86 .dll
# author: cheungmine@qq.com
# date: 2015-12-31
# note: run in MSYS
#######################################################################
import os, sys, platform

import optparse, ConfigParser

APPFILE = os.path.realpath(sys.argv[0])
APPNAME,_ = os.path.splitext(os.path.basename(APPFILE))
APPVER = "1.0"
APPHELP = "Make 32bits windows module files from MinGW .dll"

#######################################
# check if file exists
def file_exists(file):
if file and os.path.isfile(file) and os.access(file, os.R_OK):
return True
else:
return False

#######################################
# check system is msys or cmd
def check_system():
# platform.uname():
print " * platform:", platform.platform()
print " * version:", platform.version()
print " * architecture:", platform.architecture()
print " * machine:", platform.machine()
print " * network node:", platform.node()
print " * processor:", platform.processor()
if platform.architecture() != ('32bit', 'WindowsPE'):
sys.exit("[ERROR] Platform not support.")

#######################################
# get MSVC path environment
def search_vspath():
for msvc in [150, 140, 130, 120, 110, 100, 90, 80, 70, 60]:
vsenv = "VS%dCOMNTOOLS" % msvc
vspath = os.getenv(vsenv)

if vspath:
print " * %s='%s'" % (vsenv, vspath)
return vspath
sys.exit("[ERROR] VS_COMNTOOLS not found")

#######################################
# check dll file
def validate_args(dll_file, out_path):
if out_path:
if not os.path.exists(out_path):
sys.exit("[ERROR] Specified out path not exists: %s" % out_path)
if not os.path.isdir(out_path):
sys.exit("[ERROR] Specified out path not dir: %s" % out_path)
else:
out_path = os.path.dirname(APPFILE)

dllbases = []
titles = []

if file_exists(dll_file):
dllpath = os.path.dirname(dll_file)
dllbase = os.path.basename(dll_file)
title, ext = os.path.splitext(dllbase)
if ext.lower() != ".dll":
sys.exit("[ERROR] Not a .dll file: %r" % dll_file)

return (dllpath, [dllbase], [title], out_path)
elif os.path.isdir(dll_file):
for f in os.listdir(dll_file):
pf = os.path.join(dll_file, f)
if file_exists(pf):
dllbase = os.path.basename(pf)
title, ext = os.path.splitext(dllbase)
if ext.lower() == ".dll":
dllbases.append(dllbase)
titles.append(title)
if not len(dllbases):
sys.exit("[ERROR] dll files not found in given path: %s" % dll_file)
else:
return (dll_file, dllbases, titles, out_path)
else:
sys.exit("[ERROR] Either file is missing or is not readable")

#######################################
def check_results(out_path, title):
out_files = []

def_file = os.path.join(out_path, title + ".def")
if not file_exists(def_file):
print "[ERROR] file not exists: %s" % def_file
else:
out_files.append(def_file)

lib_file = os.path.join(out_path, title + ".lib")
if not file_exists(lib_file):
print "[ERROR] file not exists: %s" % lib_file
else:
out_files.append(lib_file)

exp_file = os.path.join(out_path, title + ".exp")
if not file_exists(exp_file):
print "[ERROR] file not exists: %s" % exp_file
else:
out_files.append(exp_file)

return out_files

###########################################################
# Usage for MSYS:
#   python mklib32.py -I "C:\DEVPACK\MinGW\msys\1.0\local\win32\bin" -O "./win32"
#
if __name__ == "__main__":
print "*" * 54
print "* %-50s *" % (APPNAME + " version: " + APPVER)
print "* %-50s *" % APPHELP
print "*" * 54

if len(sys.argv) == 1:
sys.exit("[ERROR] Input dll file not specified.")

parser = optparse.OptionParser(usage='python %prog [options]', version="%prog " + APPVER)

parser.add_option("-v", "--verbose",
action="store_true", dest="verbose", default=True,
help="be verbose (this is the default).")

parser.add_option("-q", "--quiet",
action="store_false", dest="verbose",
help="quiet (no output).")

group = optparse.OptionGroup(parser, APPNAME, APPHELP)

parser.add_option_group(group)

group.add_option("-I", "--dll-file",
action="store", dest="dll_file", default=None,
help="Specify input .dll file or path to export")

group.add_option("-O", "--out-path",
action="store", dest="out_path", default=None,
help="Specify path for output files")

(opts, args) = parser.parse_args()

check_system()

vspath = search_vspath()

(dllpath, dllbases, titles, out_path) = validate_args(opts.dll_file, os.path.realpath(opts.out_path))

print " * Input files:", dllpath
for dll in dllbases:
print " *             :", dll
print " * Output path:", out_path

out_dict = {}
for i in range(0, len(dllbases)):
print "-"*50
dllbase = dllbases[i]
title = titles[i]
dll_file = os.path.join(dllpath, dllbase)

print " * Make windows module definition: %s.def" % title
msyscmd = 'pexports "%s" -o > "%s.def"' % (dll_file, os.path.join(out_path, title))
ret = os.system(msyscmd)
if ret != 0:
sys.exit("[ERROR] MSYS command: %s" % msyscmd)

print " * Make windows module import file: %s.lib" % title
libcmd = 'cd "%s"&vsvars32.bat&cd "%s"&lib /def:%s.def /machine:i386 /out:%s.lib' % (vspath, out_path, title, title)
ret = os.system(libcmd)
if ret != 0:
sys.exit("[ERROR] lib command: %s" % libcmd)

out_dict[title] = check_results(out_path, title)

print "=============== Output Files Report ==============="
for title, files in out_dict.items():
print "%s.dll =>" % title

for f in files:
print " * ", os.path.basename(f)

2) 依据64位dll生成模块定义文件的python代码:

#!/usr/bin/python
# filename: mklib64.py
#   -- Make 64bits windows module files from MinGW x64 .dll
# author: cheungmine@qq.com
# date: 2015-12-31
# note: run in MSYS
#######################################################################
import os, sys, platform

import optparse, ConfigParser

APPFILE = os.path.realpath(sys.argv[0])
APPNAME,_ = os.path.splitext(os.path.basename(APPFILE))
APPVER = "1.0"
APPHELP = "Make 64bits windows module files from MinGW .dll"

#######################################
# check if file exists
def file_exists(file):
if file and os.path.isfile(file) and os.access(file, os.R_OK):
return True
else:
return False

#######################################
# check system is msys or cmd
def check_system():
# platform.uname():
print " * platform:", platform.platform()
print " * version:", platform.version()
print " * architecture:", platform.architecture()
print " * machine:", platform.machine()
print " * network node:", platform.node()
print " * processor:", platform.processor()
if platform.architecture() != ('32bit', 'WindowsPE'):
sys.exit("[ERROR] Platform not support.")

#######################################
# get MSVC path environment
# C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC
def search_vspath():
for msvc in [150, 140, 130, 120, 110, 100, 90, 80, 70, 60]:
vsenv = "VS%dCOMNTOOLS" % msvc
vspath = os.getenv(vsenv)

if vspath:
vcbat = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(vspath))), "VC\\vcvarsall.bat")
if file_exists(vcbat):
vspath = os.path.dirname(vcbat)
print " * %s='%s'" % (vsenv, vspath)
return vspath
sys.exit("[ERROR] vcvarsall.bat not found")

#######################################
# check dll file
def validate_args(dll_file, out_path):
if out_path:
if not os.path.exists(out_path):
sys.exit("[ERROR] Specified out path not exists: %s" % out_path)
if not os.path.isdir(out_path):
sys.exit("[ERROR] Specified out path not dir: %s" % out_path)
else:
out_path = os.path.dirname(APPFILE)

dllbases = []
titles = []

if file_exists(dll_file):
dllpath = os.path.dirname(dll_file)
dllbase = os.path.basename(dll_file)
title, ext = os.path.splitext(dllbase)
if ext.lower() != ".dll":
sys.exit("[ERROR] Not a .dll file: %r" % dll_file)

return (dllpath, [dllbase], [title], out_path)
elif os.path.isdir(dll_file):
for f in os.listdir(dll_file):
pf = os.path.join(dll_file, f)
if file_exists(pf):
dllbase = os.path.basename(pf)
title, ext = os.path.splitext(dllbase)
if ext.lower() == ".dll":
dllbases.append(dllbase)
titles.append(title)
if not len(dllbases):
sys.exit("[ERROR] dll files not found in given path: %s" % dll_file)
else:
return (dll_file, dllbases, titles, out_path)
else:
sys.exit("[ERROR] Either file is missing or is not readable")

#######################################
def check_results(out_path, title):
out_files = []

def_file = os.path.join(out_path, title + ".def")
if not file_exists(def_file):
print "[ERROR] file not exists: %s" % def_file
else:
out_files.append(def_file)

lib_file = os.path.join(out_path, title + ".lib")
if not file_exists(lib_file):
print "[ERROR] file not exists: %s" % lib_file
else:
out_files.append(lib_file)

exp_file = os.path.join(out_path, title + ".exp")
if not file_exists(exp_file):
print "[ERROR] file not exists: %s" % exp_file
else:
out_files.append(exp_file)

return out_files

###########################################################
# Usage for MSYS:
#   python mklib64.py -I "C:\DEVPACK\MinGW\msys\1.0\local\win64\bin" -O "./win64"
#
if __name__ == "__main__":
print "*" * 54
print "* %-50s *" % (APPNAME + " version: " + APPVER)
print "* %-50s *" % APPHELP
print "*" * 54

if len(sys.argv) == 1:
sys.exit("[ERROR] Input dll file not specified.")

parser = optparse.OptionParser(usage='python %prog [options]', version="%prog " + APPVER)

parser.add_option("-v", "--verbose",
action="store_true", dest="verbose", default=True,
help="be verbose (this is the default).")

parser.add_option("-q", "--quiet",
action="store_false", dest="verbose",
help="quiet (no output).")

group = optparse.OptionGroup(parser, APPNAME, APPHELP)

parser.add_option_group(group)

group.add_option("-I", "--dll-file",
action="store", dest="dll_file", default=None,
help="Specify input .dll file or path to export")

group.add_option("-O", "--out-path",
action="store", dest="out_path", default=None,
help="Specify path for output files")

(opts, args) = parser.parse_args()

check_system()

vspath = search_vspath()

(dllpath, dllbases, titles, out_path) = validate_args(opts.dll_file, os.path.realpath(opts.out_path))

print " * Input files:", dllpath
for dll in dllbases:
print " *             :", dll
print " * Output path:", out_path

out_dict = {}
for i in range(0, len(dllbases)):
print "-"*50
dllbase = dllbases[i]
title = titles[i]
dll_file = os.path.join(dllpath, dllbase)

print " * Make windows module definition: %s.def" % title
msyscmd = 'pexports "%s" -o > "%s.def"' % (dll_file, os.path.join(out_path, title))
ret = os.system(msyscmd)
if ret != 0:
sys.exit("[ERROR] MSYS command: %s" % msyscmd)

print " * Make windows module import file: %s.lib" % title
libcmd = 'cd "%s"&vcvarsall.bat x86_amd64&cd "%s"&lib /def:%s.def /machine:amd64 /out:%s.lib' % (vspath, out_path, title, title)
ret = os.system(libcmd)
if ret != 0:
sys.exit("[ERROR] lib command: %s" % libcmd)

out_dict[title] = check_results(out_path, title)

print "=============== Output Files Report ==============="
for title, files in out_dict.items():
print "%s.dll =>" % title

for f in files:
print " * ", os.path.basename(f)


使用起来很easy, 打开MSYS命令行:

$ python mklib64.py -I "C:\DEVPACK\MinGW\msys\1.0\local\win64\bin" -O "./win64"


******************************************************
* mklib64 version: 1.0                               *
* Make 64bits windows module files from MinGW .dll   *
******************************************************
* platform: Windows-7-6.1.7601-SP1
* version: 6.1.7601
* architecture: ('32bit', 'WindowsPE')
* machine: AMD64
* network node: ThinkPad-W520
* processor: Intel64 Family 6 Model 42 Stepping 7, GenuineIntel
* VS120COMNTOOLS='C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC'
* Input files: C:\DEVPACK\MinGW\msys\1.0\local\win64\bin
*             : libeay32.dll
*             : ssleay32.dll
* Output path: c:\DEVPACK\Workspace\temp\win64
--------------------------------------------------
* Make windows module definition: libeay32.def
* Make windows module import file: libeay32.lib
Microsoft (R) Library Manager Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.

正在创建库 libeay32.lib 和对象 libeay32.exp
--------------------------------------------------
* Make windows module definition: ssleay32.def
* Make windows module import file: ssleay32.lib
Microsoft (R) Library Manager Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.

正在创建库 ssleay32.lib 和对象 ssleay32.exp
=============== Output Files Report ===============
ssleay32.dll =>
*  ssleay32.def
*  ssleay32.lib
*  ssleay32.exp
libeay32.dll =>
*  libeay32.def
*  libeay32.lib
*  libeay32.exp

64bits的文件名称仍然是???

32.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: