1.点击新建文件或项目,点击选择,如下图:
然后正常去创建(与普通构造app项目一致),创建名称为testlesson,生成如下图所示,
其中Testlesson.h代码如下
这里面简单解释一下,TESTLESSONSHARED_EXPORT是个宏定义,在testlesson_global.h中有体现,这个TESTLESSONSHARED_EXPORT相当于一个导出的意思,把这个类导出,下面自己定义了一个函数叫testfuntion,也是导出,共后面使用:
#ifndef TESTLESSON_H
#define TESTLESSON_H
#include "testlesson_global.h"
class TESTLESSONSHARED_EXPORT Testlesson
{
public:
Testlesson();
};
extern "C" TESTLESSONSHARED_EXPORT void testfuntion();
#endif // TESTLESSON_H
testlesson_global…h代码如下,主要是宏定义的作用。
#ifndef TESTLESSON_GLOBAL_H
#define TESTLESSON_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(TESTLESSON_LIBRARY)
# define TESTLESSONSHARED_EXPORT Q_DECL_EXPORT
#else
# define TESTLESSONSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // TESTLESSON_GLOBAL_H
Testlesson.cpp代码如下:
#include "Testlesson.h"
#include <QMessageBox>
Testlesson::Testlesson()
{
}
void testfuntion()
{
QMessageBox::information(0, "title","testlib");
}
以上就是一个lib和dll文件还有相关头文件生成的过程及代码。这里要补充一下,这几者的关系,其中lib我个人总结为一个结构,起链接的作用,如果是静态链接,代码也可以封装在lib里,而dll为动态链接库,代码段都在dll里。
以下这段摘自网上:
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成
LIB文件。如果要完成源代码的编译和链接,有头文件和lib就够了。如果也使动态连接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。
.h .lib .dll三者的关系是: H文件作用是:声明函数接口 DLL文件作用是: 函数可执行代码
当我们在自己的程序中引用了一个H文件里的函数,编链器怎么知道该调用哪个DLL文件呢?这就是LIB文件的作用: 告诉链接器
调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置 ,这也就是为什么需要附加依赖项
.LIB文件,它起到桥梁的作用。如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中。
下面讲具体使用方法:讲上述生成的
然后把上面的两个.h文件和这里面的.a文件还有.dll文件放在自己的主程序文件夹中,如果用了影子模式就放在影子模式编译的文件夹中。
下一步就是这三个文件中的.a和.dll文件,这里.a文件相当于就是lib,可能在linux就叫做lib,然后在自己构造的工程中pro添加如下代码
LIBS+= -L. -l testlesson
这里-L指的是dll文件.h文件,.a文件的路径,-l指的是库的名字,会自动寻找.a文件,然后自己加上lib+名字+.a 所以我们这面要把libtestlesson.a去掉开头的lib和结尾的.a
最后就是构造和运行了。
自己总结下编译和运行的区别:
由于本人是个初学者,如果对以上还有疑问的小伙伴可以咨询zhangyin.29@163.com