VC中调用MinGW的dll
2014-06-28 10:01
253 查看
1) makefile.debug中加入
LFLAGS = -shared -mthreads -Wl,--output-def,debug\libtracesAna.def,--out-implib,debug\libtracesAna.a
生成def
如果你已经有了def文件。内容如下:
LIBRARY mylib_linux.dll
EXPORTS
printhello @1
2)命令行设置set path=%path%;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64
3)命令行运行lib.exe /machine:ix86 /def:libtracesAna.def
生成lib文件
dumpbin.exe 生成lib
一、使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
EXAMPLE:
DUMPBIN VideoDeCoder.dll /EXPROTS /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
LIBRARY tracesAna.dll
EXPORTS
CallforeInsertData @1
analyzeProcess @2
breakonce @3
initstart @4
printhello @5
release @6
releaseAndStart @7
三、使用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,重新链接即可.
最后还有一句,要自动生成.h文件好象是不行的.因为dll里没有保存函数原型,需要反汇编并分析代码才知道每个函数的参数情况.
导入导出的例子:
导入:
extern "C"
{
void printhello(char* str);
}
导出:
头文件
#ifndef PT_H
#define PT_H
#include "stdio.h"
#include <iostream>
using namespace std;
#define EXPORT __declspec(dllexport)
extern "C"
{
void EXPORT printhello(char* str);
}
#endif // PT_H
cpp文件:
#include "pt.h"
#include <iostream>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
using namespace std;
void EXPORT printhello(char* str)
{
cv::Mat a ;
cout<< "mat ok"<<endl;
cout << str << endl;
}
注意:
mingw编译的dll的依赖库,原本如果是mingw的编译的库,那如果在vc中引用,依然用原来mingw的库,有时候配置的路径会让这两个弄混,可以将依赖库直接拷贝到运行目录下。
LFLAGS = -shared -mthreads -Wl,--output-def,debug\libtracesAna.def,--out-implib,debug\libtracesAna.a
生成def
如果你已经有了def文件。内容如下:
LIBRARY mylib_linux.dll
EXPORTS
printhello @1
2)命令行设置set path=%path%;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64
3)命令行运行lib.exe /machine:ix86 /def:libtracesAna.def
生成lib文件
dumpbin.exe 生成lib
一、使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
EXAMPLE:
DUMPBIN VideoDeCoder.dll /EXPROTS /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
LIBRARY tracesAna.dll
EXPORTS
CallforeInsertData @1
analyzeProcess @2
breakonce @3
initstart @4
printhello @5
release @6
releaseAndStart @7
三、使用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,重新链接即可.
最后还有一句,要自动生成.h文件好象是不行的.因为dll里没有保存函数原型,需要反汇编并分析代码才知道每个函数的参数情况.
导入导出的例子:
导入:
extern "C"
{
void printhello(char* str);
}
导出:
头文件
#ifndef PT_H
#define PT_H
#include "stdio.h"
#include <iostream>
using namespace std;
#define EXPORT __declspec(dllexport)
extern "C"
{
void EXPORT printhello(char* str);
}
#endif // PT_H
cpp文件:
#include "pt.h"
#include <iostream>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
using namespace std;
void EXPORT printhello(char* str)
{
cv::Mat a ;
cout<< "mat ok"<<endl;
cout << str << endl;
}
注意:
mingw编译的dll的依赖库,原本如果是mingw的编译的库,那如果在vc中引用,依然用原来mingw的库,有时候配置的路径会让这两个弄混,可以将依赖库直接拷贝到运行目录下。
相关文章推荐
- VC 调用 MinGW 生成的dll
- [X264] MinGW编译x264,VC中调用libx264.dll
- VC 调用 MinGW 生成的dll
- VC 调用 MinGW 生成的dll
- 使用QT+MinGW编写动态库dll供VC或VB调用
- 使用QT+MinGW编写动态库dll供VC或VB调用
- VC 调用 MinGW 生成的dll good
- VC调用DLL
- VC调用DLL
- VC调用QT的dll 问题解决
- Delphi调用VC编译的DLL
- Vc中如何调用Dll中的函数(转载)
- 可供VC调用的QT编写的界面DLL方法
- VB调用VC dll的返回方式
- VC++动态库DLL制作和调用
- VC++和C++builder互相调用动态链接库DLL(VC++编的)笔记
- 在 VB 中调用 VC 写的 DLL
- 分享如何在VB中调用VC编写的DLL
- vb调用vcdll
- VC调用DLL