库详解

动态编译和静态编译

动态编译会产生.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

Table of Contents