zoukankan      html  css  js  c++  java
  • 利用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:DEVPACKMinGWmsys1.0localwin32in" -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.0VC
    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:DEVPACKMinGWmsys1.0localwin64in" -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:DEVPACKMinGWmsys1.0localwin64in" -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.0VC'
     * Input files: C:DEVPACKMinGWmsys1.0localwin64in
     *             : libeay32.dll
     *             : ssleay32.dll
     * Output path: c:DEVPACKWorkspace	empwin64
    --------------------------------------------------
     * 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.


  • 相关阅读:
    矩阵快速幂模板
    POJ 3761 Bubble Sort 快速幂取模+组合数学
    MySQL批量修改表前缀
    js生成条形码插件
    如何将本地代码通过git上传到码云
    jQuery常用方法
    MySQL按日、周、月统计数据
    PHP文件下载
    python报错ModelNotFoundError
    thinkphp生成的验证码提示因存在错误无法显示
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7400536.html
Copyright © 2011-2022 走看看