本文共 2052 字,大约阅读时间需要 6 分钟。
1、静态库
2、动态库
3、函数编译名称
4、MFC动态链接库和静态链接库的区别
5、extern "C"的作用
6、__stdcall和__cdecl调用区别
如果有不明白的,请移步另外一位作者文章或者自行百度
1、首先跨编译器库的调用,静态库是无法实现的,因为规则不一样!如果有能实现的大神,请博客留言给我。
2、只能用动态库的方式
1)动态库导出类是不可行的,原因是编译规则不一样,类中的函数名称无法被另外一个编译器识别
2)动态库只能导出纯C接口的函数!为什么不导出c++函数接口,也是因为编译名称不一样的原因
下面开始讲如何MFC创建动态库给QT使用
Fish.h
#pragma once// 为了让QT也能使用这个动态库,必须2个下划线!#ifdef _USRDLL#define FUNCTION_DLL_API __declspec(dllexport)#else#define FUNCTION_DLL_API __declspec(dllimport)#endif#ifdef __cplusplusextern "C"{#endifvoid FUNCTION_DLL_API Swim(void);#ifdef __cplusplus}#endif
Fish.cpp
#include "stdafx.h"#include "Fish.h"void Swim(void){ CString str = TEXT("88Fish swim"); //::MessageBox(NULL, TEXT("Fish swim"), TEXT("Win32Lib"), MB_OK); AfxMessageBox(str);}
#include "mainwindow.h"#include "ui_mainwindow.h"#include#include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui->setupUi(this);}MainWindow::~MainWindow(){ delete ui;}void MainWindow::on_pushButton_clicked(){ QString qexeFullPath = QCoreApplication::applicationDirPath() + "/FunctionDll.dll"; QLibrary lib(qexeFullPath); if (!lib.load()) { QMessageBox::warning(this, "Test", "找不到动态库"); return; } typedef void (*SWimFunction)(void); SWimFunction Swim=(SWimFunction)lib.resolve("Swim"); if (Swim == nullptr) { QMessageBox::warning(this, "Test", "找不到动态库中Swim函数"); } else { Swim(); } lib.unload();}
运行结果如下:
同样把生成的动态库拷贝到Qt工程调试目录下 ,并且也拷贝一份和fish文件一起到Qt工程目录下
pro文件中加
LIBS += $$PWD/FunctionDll.dll
调用过程,同样可以达到上面的效果
#include "mainwindow.h"#include "ui_mainwindow.h"#include "Fish.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui->setupUi(this);}MainWindow::~MainWindow(){ delete ui;}void MainWindow::on_pushButton_clicked(){ Swim();}
但是如果dll文件没在exe目录下,程序崩溃了,但是你不知道是什么原因导致的!!!!!
转载地址:http://pkmai.baihongyu.com/