`

[Mingw与VC++互操作] MingW使用VC编译的dll

阅读更多
采用ming C编译,将ming/bin加入path
(注:pythonxx.dll一般在winnt/system32下,以下操作后文件如xx.def,xx.a放到python/libs下)

1)pexports python24.dll >python24.def

2)dlltool --dllname python24.dll --def python24.def --output-lib libpython24.a

使用sqlite3,只有.dll和.def文件,为了直接用它,需要一个lib文件,使用以下命令行好了:) lib /def:xx.def /out:xx.lib lib是vc++带的工具. 下面是ms 官方的连接: http://support.microsoft.com/kb/q131313/

pexports 这个工具似乎在vc和mingw默认安装里都没有


在VC中针对无LIB时的DLL隐式链接,制作可供VC++使用的LIB函数符号输入库。具体步骤如下:

一、使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
EXAMPLE:

DUMPBIN VideoDeCoder.dll /EXPORTS /OUT:VideoDeCoder.def
二、将导出的.DEF文件整理为一符合.DEF个数的函数导出文件
EXAMPLE:VideoDeCoder.DEF 文件内容如下

Dump of file VideoDeCoder.dll                                 
                                                                      
        File Type: DLL                                                
                                                                      
          Section contains the following exports for VideoDeCoder.dll 
                                                                      
                   0 characteristics                                  
            3D49E48F time date stamp Fri Aug 02 09:46:55 2002         
                0.00 version                                          
                   1 ordinal base                                     
                  11 number of functions                              
                  11 number of names                                  
                                                                      
            ordinal hint RVA      name                                
                                                                      
                  1    0 00010F60 _TM_ClearDecoderBuff@4              
                  2    1 00010E80 _TM_CloseDecoder@4                  
                  3    2 00010F00 _TM_DecodePicture@4                 
                  4    3 00010ED0 _TM_DecodePictureHeader@4           
                  5    4 00010FD0 _TM_GetFileEnd@4                    
                  6    5 00011030 _TM_GetUValue@4                     
                  7    6 00011060 _TM_GetVValue@4                     
                  8    7 00011000 _TM_GetYValue@4                     
                  9    8 00010E10 _TM_OpenDecoder@8                   
                 10    9 00010F30 _TM_ReturnType@4                    
                 11    A 00010F90 _TM_SetFileEnd@8                    
                                                                      
          Summary                                                     
                                                                      
                2000 .data                                            
                1000 .rdata                                           
                1000 .reloc                                           
               15000 .text
按照以下方法整理:
1)添加LIB说明

LIBRARY "VideoDeCoder"            ;"xx"为DLL名称
DESCRIPTION "VideoDeCoder library"
2)去掉导出函数说明端以外的内容,在LIB说明下添加 "EXPROTS" 说明导出函数

LIBRARY "VideoDeCoder"
DESCRIPTION "VideoDeCoder library"

EXPORTS
            ordinal hint RVA      name                         
                                                               
                  1    0 00010F60 _TM_ClearDecoderBuff@4           
                  2    1 00010E80 _TM_CloseDecoder@4           
                  3    2 00010F00 _TM_DecodePicture@           
                  4    3 00010ED0 _TM_DecodePictureH           
                  5    4 00010FD0 _TM_GetFileEnd@4             
                  6    5 00011030 _TM_GetUValue@4              
                  7    6 00011060 _TM_GetVValue@4              
                  8    7 00011000 _TM_GetYValue@4              
                  9    8 00010E10 _TM_OpenDecoder@8            
                 10    9 00010F30 _TM_ReturnType@4             
                 11    A 00010F90 _TM_SetFileEnd@8
3)将所有的函数放至行首,去掉 "hint" 和 "RVA" 数据,留下函数的序号 "ordinal" ,在序号前加上 "@" 符号 形成 "_导出函数名@参数字节和 @序号" 此种格式(__stdcall 方式调用导出的函数符号是 "函数名称@参数字节和"). 最后形成.DEF文件如下:

LIBRARY "VideoDeCoder"
  DESCRIPTION "VideoDeCoder library"

  EXPORTS
     
  TM_ClearDecoderBuff@4             @1   
  TM_CloseDecoder@4                 @2   
  TM_DecodePicture@4                @3   
  TM_DecodePictureHeader@4          @4   
  TM_GetFileEnd@4                   @5   
  TM_GetUValue@4                    @6   
  TM_GetVValue@4                    @7   
  TM_GetYValue@4                    @8   
  TM_OpenDecoder@8                  @9   
  TM_ReturnType@4                  @10   
  TM_SetFileEnd@8                  @11
三、使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
EXAMPLE:

LIB /DEF:VideoDeCoder.def /MACHINE:IX86
四、接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错: error LNK2002:unresolved external symbol "functionname@nn" 提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立 LIB,重新链接即可.

分享到:
评论

相关推荐

    mingw调用MSVC编译的dll

    ### mingw调用MSVC编译的dll 在软件开发过程中,经常会出现不同编译环境下的库文件(如DLL)需要被另一个环境调用的情况。本文将详细介绍如何在MinGW环境中调用由Microsoft Visual C++ (MSVC) 编译器生成的DLL。 #...

    MingW VC 之.a .lib .dll .def 关系

    MingW VC 之.a .lib .dll .def 关系主要涉及的是在Windows环境下,使用Microsoft Visual C++ (MSVC) 和 MinGW 工具链编译C或C++程序时,不同类型的文件及其相互关系。这里主要讲解的是库文件、动态链接库(DLL)、导...

    libevent-2.0.22-stable在windows环境下使用mingw编译

    标题"libevent-2.0.22-stable在windows环境下使用mingw编译"指的是一个关于使用MinGW编译工具在Windows操作系统上构建libevent库的2.0.22稳定版本的过程。libevent是一个开源的、跨平台的事件通知库,它提供了一种...

    从dll生成mingw下的.a工具

    总的来说,从DLL转换为MinGW下的.a文件涉及对Windows动态链接库的理解、使用`pexports`和`dlltool`工具,以及对编译链接过程的掌握。通过这个过程,你可以确保程序在运行时不再依赖外部的DLL,使得部署更加简单。

    使用 mingw 编译的 lsqlite3_svn08

    使用 mingw 编译出 sqlite3.dll 和 sqlite3.exe 2. lsqlite3 (也是本压缩包的原型) http://lua.sqlite.org 从下面网址下载 Version 0.8 http://lua.sqlite.org/index.cgi/zip/lsqlite3_svn08.zip?uuid=svn_8 ...

    mingw编译osg插件

    对于那些习惯使用Visual Studio (VS) 或其他IDE的人来说,本文提供了一种不同于主流编译方式的新途径—使用mingw进行编译。这对于习惯使用QtCreator等基于mingw的开发环境的开发者来说尤为重要。 #### libjpeg插件...

    mingw编译后的libjpeg-9a

    在 MingW 编译环境下,这个库是专门为使用MinGW工具链(一个在Windows上模拟GCC编译环境的工具集)的开发者准备的。MingW允许开发者使用熟悉的GCC编译器来构建和调试Windows应用程序,而无需使用Microsoft Visual ...

    MINGW缺少的DLL文件

    MingW,全称为 Minimalist GNU for Windows,是一个开源的开发环境,它允许用户在Windows操作系统上使用GNU工具链进行C、C++等编程语言的编译。当在使用MingW时遇到“缺少的DLL文件”问题,通常是因为系统缺乏某些...

    OpenSSL1.0.1e,MinGW编译静态库

    3. 配置编译选项:进入OpenSSL源码目录,使用`Configure`脚本来配置编译选项,指定MinGW的交叉编译环境。例如: ``` configure --prefix=/path/to/install/directory --target=i686-w64-mingw32 --static ``` ...

    libusb+wingw源码(已经编译过)

    这里提到使用MinGW编译libusb源码,这意味着用户不需要自己配置编译环境,可以直接利用编译好的库文件进行开发。"生成了windows下vs可用的lib和dll"进一步强调了这些库文件可以无缝集成到Visual Studio项目中,使得...

    使用mingw编译后的zlib-1.2.5安装包

    本压缩包包含的是使用MinGW(Minimalist GNU for Windows)4.9.2版本编译后的Zlib 1.2.5安装包,适用于Windows环境。 MinGW是GCC(GNU Compiler Collection)在Windows上的一个移植版本,它提供了与Linux环境下类似...

    基于Qt的MinGw编译PCL及其所有依赖库boost、eigen、flann、qhull、VTK

    在本文中,我们将深入探讨如何在Windows环境下使用Qt与MinGW编译Point Cloud Library (PCL) 及其依赖库,包括boost、eigen、flann、qhull和VTK。这一过程对于开发者来说至关重要,因为能够确保在Qt环境中直接运行PCL...

    运用MinGW和CodeBlocks在Windows上编译wxWidgets及使用

    本指南将详细介绍如何利用MinGW(Minimalist GNU for Windows)和Code::Blocks集成开发环境(IDE)在Windows上编译和使用wxWidgets库。 ### 1. wxWidgets简介 **1.1 wxWidgets版本** wxWidgets库有多个版本,每个...

    python通过ctypes调用mingw编译的C语言DLL库模板示例

    内容概要: 1. python通过ctypes调用C DLL库,传递结构体,保存信息 2. 解析xls表格数据,调用C接口,将信息写入到文件 3. mingw编译C DLL库用例 适用人群:python+C程序员 使用场景及目标:开发 其它说明:无

    cryptopp840 Windows mingw 编译可用

    标题中的“cryptopp840 Windows mingw 编译可用”指的是一个关于Cryptopp库的特定版本840,在Windows操作系统环境下,使用MinGW编译器成功编译并可供使用的资源。Cryptopp是一个C++类库,提供了各种加密算法和密码学...

    Qt5.6.3的windows minGW版本静态编译的方法

    然而,需要注意的是,静态编译可能会增加程序的启动时间,且由于LGPL协议,如果商业软件使用了静态编译的Qt,可能需要开源其与Qt相关的源代码。因此,在选择编译方式时,应权衡利弊,根据项目需求进行决策。

    QTMinGw下已经编译好的gdal库

    标题提及的是“QTMinGW下已经编译好的gdal库”,这意味着我们无需从源代码编译GDAL,而是可以直接使用预编译的库文件,这极大地简化了开发流程。MinGW(Minimalist GNU for Windows)是GCC(GNU Compiler Collection...

    使用mingw编译后的libxml2-2.7.7安装包

    ** MingW 编译环境与libxml2-2.7.7** MingW(Minimalist GNU for Windows)是一款在Windows环境下使用的开源GCC(GNU Compiler Collection)编译工具链,它使得开发者能够在Windows上使用类似GNU开发环境的命令行...

    libiconv1.14 mingw编译出来的安装包

    《libiconv1.14 Mingw编译与应用详解》 libiconv是一个广泛使用的字符集转换库,它的主要任务是将数据从一种字符编码转换到另一种编码。在这个名为"libiconv1.14 mingw编译出来的安装包"的压缩文件中,包含了...

    Qt6.22 Mingw64静态编译

    本篇文章将详细探讨如何在Windows环境下,使用Mingw64工具集进行Qt6.2.2的静态编译。 首先,理解静态编译的概念至关重要。静态编译意味着在编译应用程序时,将所有依赖的库(如Qt库)合并到最终的可执行文件中,...

Global site tag (gtag.js) - Google Analytics