Qt不同版本编译器,调用VC++生成的动态链接库

今天用QT编译生成的共享库自己却怎么都不能调用,查了N久后找到这个帖子,发现搞定了,记录一下

http://qiusuoge.com/12720.html

Qt如何调用VC++生成的动态链接库?假设当前有VC++编译器生成的动态库文件testdll.h,testdll.lib和testdll.dll。

testdll.h文件源码如下:

#ifdef TESTDLL_EXPORTS

#define TESTDLL_API __declspec(dllexport)

#else

#define TESTDLL_API __declspec(dllimport)

#endif

// 此类是从 testdll.dll 导出的

class TESTDLL_API Ctestdll {

public:

Ctestdll(void);

public:

int Add(int a, int b) {return a+b;}

int Sub(int a, int b) {return a-b;}

int Mul(int a, int b) {return a*b;}

};

extern TESTDLL_API int ntestdll;

TESTDLL_API int fntestdll(void);

Qt如何使用这些动态链接库文件?

一、情况1,编程环境是Qt Creator+Qt libraries 4.8.6 for Windows (VS 2010)

Qt库是VS2010版本,VC++编译器生成的。所以工程可以直接使用testdll.h头文件和testdll.lib引入库文件。

1、把testdll.h拷贝到工程路径;

2、工程文件XXX.pro需要手动添加"HEADERS += testdll.h"和"LIBS += testdll.lib";

3、编译前,需要把lib文件:testdll.lib和testdll.dll一起拷贝到构建路径下面。

如此便可以正常使用VC++动态链接库函数。

二、情况2,编程环境是Qt Creator+Qt libraries 4.8.6 for Windows (MinGW 4.8.2)

Qt库是MinGW版本,gcc编译器生成,与VC++编译器不是同个体系。所以工程不可以使用testdll.h头文件和testdll.lib引入库文件。

对于调用DLL的方法,Qt本身就有相应的类来实现。

#include "dialog.h"

#include <QApplication>

#include <QLibrary>

typedef int (*func_Add)(int a, int b); //定义函数指针

typedef int (*func_Sub)(int a, int b);

typedef int (*func_Mul)(int a, int b);

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

QLibrary mylib("testdll.dll");//testdll.dll的存放路径与.exe一致

if (mylib.load())

{

//"[email protected]@@[email protected]"等字符串其实就是动态库函数int Add(int a, int b)的变体,请使用微软工具DEPENDS.EXE查看得到

func_Add f1 = (func_Add)mylib.resolve("[email protected]@@[email protected]");

func_Sub f2 = (func_Sub)mylib.resolve("[email protected]@@[email protected]");

func_Mul f3 = (func_Mul)mylib.resolve("[email protected]@@[email protected]");

int rt = 0;

if (f1 != NULL)

{

rt = f1(10, 12);

}

if (f2 != NULL)

{

rt = f2(10, 12);

}

if (f3 != NULL)

{

rt = f3(10, 12);

}

}

Dialog w;

w.show();

return a.exec();

}

时间: 2024-11-05 17:23:56

Qt不同版本编译器,调用VC++生成的动态链接库的相关文章

Java采用JNI调用VC++生成的dll(Java与C++交互)

应项目需求,需要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组需要和C++和Android进行交互.下面是java和C++采用JNI的方式进行接口传参交互,我做的一个demo并运行成功. 什么是JNI? JNI全拼是Java Native Interface,中文意思为Java本地调用.JNI标准是Java平台的一部分,它允许java和其他语言的代码进行交互.JNI开始是为了本地已经编译好的语言,尤其是C和C++而设计的,我们也可以使用J

Java採用JNI调用VC++生成的dll(Java与C++交互)

应项目需求,须要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组须要和C++和Android进行交互.以下是java和C++採用JNI的方式进行接口传參交互,我做的一个demo并执行成功. 什么是JNI? JNI全拼是Java Native Interface,中文意思为Java本地调用.JNI标准是Java平台的一部分.它同意java和其它语言的代码进行交互.JNI開始是为了本地已经编译好的语言,尤其是C和C++而设计的.我们也能够使用J

C++ builder调用vc编写的动态链接库的方法

//启动com库 WSADATA Data_WSA; int nWSAStartup = WSAStartup(MAKEWORD(1, 1), &Data_WSA); if( nWSAStartup != 0 ) { return; } //加载动态链接库 AnsiString str= strPath + (AnsiString)"\\Net.dll"; HINSTANCE handle = LoadLibrary(str.c_str()); if (handle == NU

Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)

下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this);     QFileInfo fileinfo(appUrl);     QString appPath = QApplication::applicationDirPath()+SAVEDIR+"/"+fileinfo.fileName();     bool res = proce

Qt在Mac OS X下的编程环境搭建(配置Qt库和编译器,有图,很清楚)

尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/46234079 在Mac OS X下使用Qt开发,需要配置Qt库和编译器.编译器只能使用苹果公司自主研发的Clang.1.分别下载并安装XCode和Command Line Tools(必须安装),安装完毕后,Clang就有了. https://developer.apple.com/downloads/ 2.下载Qt并默认安装 http://down

Windows程序调试系列: 使用VC++生成调试信息 转

Windows程序调试系列: 使用VC++生成调试信息 ZhangTao,[email protected], 译自 “Generating debug information with Visual C++”,Oleg Starodumov 出处: http://www.cnblogs.com/itrust/archive/2006/08/17/479603.aspx 引子 当我们使用调试器来调试程序时,我们希望能够单步调试到源代码中,在代码中设置断点,观察变量的值(包括用户自定义的复杂类型的

asp.net下调用Matlab生成动态链接库

对于这次论文项目,最后在写一篇关于工程的博客,那就是在asp.net下调用matlab生成的dll动态链接库.至今关于matlab,c/c++(opencv),c#(asp.net)我总共写了4篇配置的博客,配置问题搞了我们差不多2周多的时间,各种编译不通过,各种链接出问题,各种头疼,甚至都有放弃asp.net下建工程,转用matlab的gui来实现前端界面的念头了.但是在队友的强烈要求下,我不得不硬着头皮搞下这配置问题,最终总结出这4篇配置博客.其中艰辛,恐怕连队友都不甚了解. 当然在实验室同

Qt的目录依赖问题----怎样生成一个绿色的Qt软件包

Qt的目录依赖问题----怎样生成一个绿色的Qt软件包 一.核心问题: 如果将编译好的Qt文件拷贝到任何目录下,作为一个绿色软件库来使用? 二.原理讨论 由于Qt在编译的时候将安装路径硬编码到了库文件中,这个问题似乎不太好解决.使用如下命令,可以查看到底有哪些路径: qmake -query 可得到类似的如下结果: QT_INSTALL_PREFIX:/usr/lib/qt4 QT_INSTALL_DATA:/usr/lib/qt4 QT_INSTALL_DOCS:/usr/share/doc/

编译器会自动生成default constructor,这是真的吗?

相信很多人的回答都是"是的吧".Okay,是不是真的先不提了,先来看一个例子看看下面的代码能否编译通过,如果编译通过,能运行吗?如果不能运行,在哪出错? class foo { public: int val; foo *pNext; }; void Test1(){ foo f; if (f.val || f.pNext ){ cout << "in if" << endl; } } int main(){ Test1(); return