库详解
动态编译和静态编译
动态编译会产生.lib和.dll,其中.lib叫导入库。指向了dll的函数入口,并不包含完整的代码!所以不能只靠此lib完成库的调用,还需要.dll支持,具体用法是pro中LIBS+=.a(.lib)。然后隐式调用.dll 静态编译会产生.lib, 这个lib就是传统意义上的静态链接库,在pro中LIBS+=.a(.lib)就可以在编译期,完成库的包含,不需要.dll
如果只使用.dll
只使用.dll需要显式调用.dll。 注意的是如果对外的.h中是函数,则不会有问题。如果对外的是类,则需要用函数将类实例化后外部调用此函数。其中还有注意事项:直接调用会报错。 第一种方法是把类中的函数写成virtual
#pragma once
#include "mainfunc_global.h"
#include <string>
class MAINFUNC_EXPORT MainFunc {
public:
MainFunc();
virtual int add(int a,int b);
virtual void printMsg(QString msg);
};
extern "C" {//一定要添加上
MAINFUNC_EXPORT MainFunc* getDllObj();
MAINFUNC_EXPORT char* text();
MAINFUNC_EXPORT int printInt();
}
第二种方法是不使用virtual直接在.pro中增加LIBS += .dll
具体的动态调用以及显式加载.dll
#include <QMessageBox>
#include "../MainFunc/MainFunc.h"
#include <QLibrary>
#include <QDebug>
typedef MainFunc* (*getObj)();
typedef char* (*dllText)();
typedef int (*dllPrintInt)();
void QtVS2015::slotTest() {
QLibrary* mainFunDll = new QLibrary("MainFunc.dll");
if (mainFunDll->load()) {
getObj obj = (getObj)mainFunDll->resolve("getDllObj");
MainFunc* mF = obj();
mF->printMsg(QStringLiteral("这是一个DLL调用程序"));
qDebug()<<mF->add(4, 7);
dllText dText = (dllText)mainFunDll->resolve("text");
qDebug() << QString::fromLocal8Bit(dText());
dllPrintInt dPrintInt = (dllPrintInt)mainFunDll->resolve("printInt");
qDebug() << dPrintInt();
} else {
QMessageBox* msgBox = new QMessageBox;
msgBox->setText(QStringLiteral("动态库加载失败!"));
msgBox->setWindowTitle(QStringLiteral("信息框"));
msgBox->show();
}
}
新增一点内容: .pro中直接使用LIBS += .dll 然后 include .h 可以直接使用其中的库函数,不需要另外操作,且类和函数都可以
Q:既然如此为什么不在.pro中直接LIBS += .dll 而是 += .a 通过导入库来寻找.dll呢 A:猜测是导入两种方式,导入的都是动态链接库。实测两者都可以隔库断点
参考: https://blog.csdn.net/wb175208/article/details/86181626 https://blog.csdn.net/weixin_29527111/article/details/112931820?ops_request_misc=&request_id=&biz_id=102&utm_term=qt%E6%98%BE%E5%BC%8F%E8%B0%83%E7%94%A8dll%20%E5%B9%B6%E4%B8%94dll%E4%B8%AD%E6%9C%89%E7%B1%BB&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-112931820.142^v99^pc_search_result_base8&spm=1018.2226.3001.4187