将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. OpenCV环境搭建(一)

    此环境搭建是OpenCV的python(一下简称py)开发环境搭建,建立在py3的环境和语法上实现的. windows系统搭建 系统环境:windows 10 + python 3.6 + OpenC ...

  2. 在腾讯云的ubuntu服务器上面安装git服务器

    GitHub是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用.搭建Git服 ...

  3. 负载均衡LVS(DR模式)安装实战

    1.编译安装ipvsadm 首先从LVS官网下载tarball,解压后make && make install即可. 要注意的是LVS的依赖有:popt-static.libnl.ke ...

  4. RDO Stack Exception: UnboundLocalError: local variable 'logFile' referenced before assignment

    Issue: When you install RDO stack on CentOS, you may encounter following error. Error: [root@localho ...

  5. 20160220.CCPP体系详解(0030天)

    程序片段(01):对称.c 内容概要:对称 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h ...

  6. vbs注册表增删改

    vbs注册表增删改非常简单.过去竟然能忍受那么多次手动在注册表编辑器操作...应该认真反思自己的懒惰了. Dim op Set op=WScript.CreateObject("WScrip ...

  7. 记住经典的斐波拉契递归和阶乘递归转换为while规律

    记住经典的斐波拉契递归和阶乘递归转换为while规律.它为实现更复杂转换提供了启发性思路. # 斐波拉契--树形递归 def fab(n): if n<3: return n return fa ...

  8. JVM内存区域划分(JDK6/7/8中的变化)

    前言 Java程序的运行是通过Java虚拟机来实现的.通过类加载器将class字节码文件加载进JVM,然后根据预定的规则执行.Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同 ...

  9. Swift中不用桥接文件和.h头文件直接和C代码交互的方法

    我们知道一般情况下Swit要想调用obj-c,c或c++代码必须通过obj-c以及桥接文件才可以办到,但是对于某些简单的代码,我们可以跳过桥接文件和.h头文件,直接和C代码交互呢! 我们再Projec ...

  10. SQLite 语法(http://www.w3cschool.cc/sqlite/sqlite-syntax.html)

    SQLite 语法 SQLite 是遵循一套独特的称为语法的规则和准则.本教程列出了所有基本的 SQLite 语法,向您提供了一个 SQLite 快速入门. 大小写敏感性 有个重要的点值得注意,SQL ...