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.


  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    108. Convert Sorted Array to Binary Search Tree
    111. Minimum Depth of Binary Tree
    49. Group Anagrams
    使用MALTAB标定实践记录
    442. Find All Duplicates in an Array
    522. Longest Uncommon Subsequence II
    354. Russian Doll Envelopes
    opencv 小任务3 灰度直方图
    opencv 小任务2 灰度
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7400536.html
Copyright © 2011-2022 走看看