将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使用的更多相关文章

  1. 利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl

    利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl 首先mingw的环境搭建,务必遵循下文: http://blog.csdn.net/ubuntu64fan/ar ...

  2. 利用openssl管理证书及SSL编程第1部分: openssl证书管理

    利用openssl管理证书及SSL编程第1部分 参考:1) 利用openssl创建一个简单的CAhttp://www.cppblog.com/flyonok/archive/2010/10/30/13 ...

  3. 基于X.509证书和SSL协议的身份认证过程实现(OpenSSL可以自己产生证书,有TCP通过SSL进行实际安全通讯的实际编程代码)good

    上周帮一个童鞋做一个数字认证的实验,要求是编程实现一个基于X.509证书认证的过程,唉!可怜我那点薄弱的计算机网络安全的知识啊!只得恶补一下了. 首先来看看什么是X.509.所谓X.509其实是一种非 ...

  4. openssl建立证书,非常详细配置ssl+apache

    原文链接:http://blog.51yip.com/apachenginx/958.html openssl建立证书,非常详细配置ssl+apache 张映 发表于 2010-08-07 分类目录: ...

  5. 利用keytool、openssl生成证书文件

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52225073 本文出自: [HansChen的博客] 用openssl指令逐步生成各 ...

  6. Security基础(三):OpenSSL及证书服务、邮件TLS/SSL加密通信

    一.OpenSSL及证书服务 目标: 本案例要求熟悉OpenSSL工具的基本使用,完成以下任务操作: 使用OpenSSL加密/解密文件 搭建企业自有的CA服务器,为颁发数字证书提供基础环境 方案: 使 ...

  7. 如何利用OpenSSL生成证书

    此文已由作者赵斌授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.前言 最近为了测试内容分发网络(Content Delivery Network,简称 CDN)添加的新功 ...

  8. 使用 openssl 生成证书

    一.openssl 简介 目前最流行的 SSL 密码库工具官网:https://www.openssl.org/source/ 构成部分 密码算法库 密钥和证书封装管理功能 SSL通信API接口 用途 ...

  9. SSL编程(1) 概述

    文章来自本园马若望 SSL是TCP/IP环境上的标准的安全加密传输协议.SSL的全称是安全的 Socket层,它具有与Socket类似的客户端/服务器体制.常见的https即http+ssl,从安全的 ...

随机推荐

  1. Splay讲解

    Splay讲解 Splay是平衡树的一种,是一种二叉搜索树,我们先讲解一下它的核心部分. Splay的核心部分就是splay,可能有些人会说什么鬼?这样讲解是不是太不认真了?两个字回答:不是.第一个S ...

  2. nodejs基础教程回顾01

    最近在复习nodejs,因为框架太多隔一段时间不用就会忘了,所以没办法必须时常拿出来练练,就像家里有好几辆车,要时不常的轮流开一圈.我就从最基础的开始写,怎么下载安装就不说了,首先是nodejs的三类 ...

  3. 函数&语法

    定义一个函数 加上一些算法,由自己定义的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参 ...

  4. Node.js Net 模块

    Node.js Net 模块提供了一些用于底层的网络通信的小工具,包含了创建服务器/客户端的方法,我们可以通过以下方式引入该模块: var net = require("net") ...

  5. MySQL 排序

    MySQL 排序 我们知道从MySQL表中使用SQL SELECT 语句来读取数据. 如果我们需要对读取的数据进行排序,我们就可以使用MySQL的 ORDER BY 子句来设定你想按哪个字段哪中方式来 ...

  6. MySQL UPDATE 查询

    MySQL UPDATE 查询 如果我们需要修改或更新MySQL中的数据,我们可以使用 SQL UPDATE 命令来操作.. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用SQL语 ...

  7. JAVA生成数字0~9字母A~Z混合编码0000、0001...0009、000A...000Z、0010......

    分别是求下一个编码 和 输出所有编码 /** * 用1--9加A--Z混合编码 使用ASCII码判断 * LYL * 传一个值 求下一个编码 */ public String getABCDCode( ...

  8. android ActionBarActivity设置全屏无标题

    新建的Activity继承自ActionBarActivity,设置全屏无标题本来很简单的事,但是没想到app竟然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时!!! 原因是Actio ...

  9. RunLoop总结:RunLoop的应用场景(三)

    今天要讲的RunLoop的应用场景可能太简单了,所以东西比较少.因为跟UITableView.UICollectionView等的滑动优化有关,就顺便总结一下会影响UITableView.UIColl ...

  10. Android的Spinner控件用法解析

    微调框 微调框提供一种方法,让用户可以从值集中快速选择一个值.默认状态下,微调框显示其当前所选的值. 触摸微调框可显示下拉菜单,其中列有所有其他可用值,用户可从中选择一个新值. 您可以使用 Spinn ...