利用openssl管理证书及SSL编程第3部分:将MinGW编译的openssl dll导出def和lib供MSVC使用
将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)
使用起来非常简单, 打开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.
利用openssl管理证书及SSL编程第3部分:将MinGW编译的openssl dll导出def和lib供MSVC使用的更多相关文章
- 利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl
利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl 首先mingw的环境搭建,务必遵循下文: http://blog.csdn.net/ubuntu64fan/ar ...
- 利用openssl管理证书及SSL编程第1部分: openssl证书管理
利用openssl管理证书及SSL编程第1部分 参考:1) 利用openssl创建一个简单的CAhttp://www.cppblog.com/flyonok/archive/2010/10/30/13 ...
- 基于X.509证书和SSL协议的身份认证过程实现(OpenSSL可以自己产生证书,有TCP通过SSL进行实际安全通讯的实际编程代码)good
上周帮一个童鞋做一个数字认证的实验,要求是编程实现一个基于X.509证书认证的过程,唉!可怜我那点薄弱的计算机网络安全的知识啊!只得恶补一下了. 首先来看看什么是X.509.所谓X.509其实是一种非 ...
- openssl建立证书,非常详细配置ssl+apache
原文链接:http://blog.51yip.com/apachenginx/958.html openssl建立证书,非常详细配置ssl+apache 张映 发表于 2010-08-07 分类目录: ...
- 利用keytool、openssl生成证书文件
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52225073 本文出自: [HansChen的博客] 用openssl指令逐步生成各 ...
- Security基础(三):OpenSSL及证书服务、邮件TLS/SSL加密通信
一.OpenSSL及证书服务 目标: 本案例要求熟悉OpenSSL工具的基本使用,完成以下任务操作: 使用OpenSSL加密/解密文件 搭建企业自有的CA服务器,为颁发数字证书提供基础环境 方案: 使 ...
- 如何利用OpenSSL生成证书
此文已由作者赵斌授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.前言 最近为了测试内容分发网络(Content Delivery Network,简称 CDN)添加的新功 ...
- 使用 openssl 生成证书
一.openssl 简介 目前最流行的 SSL 密码库工具官网:https://www.openssl.org/source/ 构成部分 密码算法库 密钥和证书封装管理功能 SSL通信API接口 用途 ...
- SSL编程(1) 概述
文章来自本园马若望 SSL是TCP/IP环境上的标准的安全加密传输协议.SSL的全称是安全的 Socket层,它具有与Socket类似的客户端/服务器体制.常见的https即http+ssl,从安全的 ...
随机推荐
- jquery easyui combobox 高度自适应
data-options="required:true,editable:false,panelHeight:'auto'" 加上panelHeight:'auto'即可 列合并 ...
- Servlet生命周期与工作原理(转载)
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
- 修改apache默认主页,重定向404页面
yum 下载apache后默认主页 默认配置文件: vim /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/welcome.conf 跳转页面到 /var/w ...
- Tarjan笔记1
Tarjan 2822 爱在心中 ** 时间限制: 1 s ** 空间限制: 128000 KB ** 题目等级 : 钻石 Diamond 题解 题目描述 Description"每个人都拥 ...
- zabbix API基本使用方法介绍
前言: 以下内容根据zabbix 3.2官方文档总结:https://www.zabbix.com/documentation/3.2/manual/api 此文档只是简单的介绍API的基本使用,关于 ...
- JavaScript 错误处理 Throw、Try 和 Catch
try 语句测试代码块的错误. catch 语句处理错误. throw 语句创建自定义错误. JavaScript 错误 当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错 ...
- mongo 读分析
分布式读 读冲突 分布式中数据库有多份数据,各份数据可能存在不一致性. mongo 只会写到primary节点上,理论上来说不会有文档冲突,也就是说数据库中的数据都以primary节点为标准. 但是有 ...
- 在Spring Boot框架下使用WebSocket实现消息推送
Spring Boot的学习持续进行中.前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目(使用Spring Boot开发Web项目)以及怎样为我们的Project添加HTTPS的 ...
- SpringBatch简介
spring Batch是一个轻量级的.完善的批处理框架,旨在帮助企业建立健壮.高效的批处理应用.SpringBatch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使 ...
- 深入Java虚拟机(3)——安全
因为网络允许多台计算机共享数据和分布式处理,所以它提供了一条入侵计算机系统的潜在途径,使得其他人可以窃取信息,改变或破坏信息,盗取计算机资源等等.为了解决由网络引起的安全问题,Java体系结构采用了一 ...