最新查询利用Qt创建动态库的步骤,发现图文解释都不够详细,于是自己总结一个较为详细的图文步骤。
创建动态库
创建Qt动态库的详细步骤如下:
-
打开Qt Creator,创建一个新的项目。选择 “Library” 作为项目类型,然后选择 “C++ Library”。
-
在 “Library” 选项卡中,命名项目名称,并设置存放路径。
-
点击 “Next”,在Details部分,设置库类型,类名称,以及Qt模块类型
-
根据需要选择构建套件(编译工具),随后点击下一步
-
项目创建完成后,会生成一个MyLib_global.h,在windows平台下默认生成如下内容:
#ifndef MYLIB_GLOBAL_H #define MYLIB_GLOBAL_H #if defined(_MSC_VER) || defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) # define Q_DECL_EXPORT __declspec(dllexport) # define Q_DECL_IMPORT __declspec(dllimport) #else # define Q_DECL_EXPORT __attribute__((visibility("default"))) # define Q_DECL_IMPORT __attribute__((visibility("default"))) #endif #if defined(MYLIB_LIBRARY) # define MYLIB_EXPORT Q_DECL_EXPORT #else # define MYLIB_EXPORT Q_DECL_IMPORT #endif #endif // MYLIB_GLOBAL_H
默认生成的mylib.h的内容为:
#ifndef MYLIB_H #define MYLIB_H #include "MyLib_global.h" class MYLIB_EXPORT MyLib { public: MyLib(); }; #endif // MYLIB_H
可以看到其中包含了==#include “MyLib_global.h”,并且类定义中包含了MYLIB_EXPORT==。
-
向MyLib项目添加一个新的类对象Worker,注意worker的头文件中要添加
#include "MyLib_global.h"
并在类名前面添加MYLIB_EXPORT
,将其头文件和源文件实现如下:worker.h
#ifndef WORKER_H #define WORKER_H #include <iostream> #include <string> #include "MyLib_global.h" using namespace std; using uint = unsigned int; class MYLIB_EXPORT Worker { private: string name; uint age; uint Id; uint rank = 7; public: Worker(); Worker(string m_name, uint m_age, uint m_Id); Worker(string m_name, uint m_age, uint m_Id, uint m_rank); uint getRank(); void setRank(uint m_rank); void workerInfo(); }; #endif // WORKER_H
worker.cpp
#include "worker.h" Worker::Worker() { } Worker::Worker(string m_name, uint m_age, uint m_Id) { name = m_name; age = m_age; Id = m_Id; } Worker::Worker(string m_name, uint m_age, uint m_Id, uint m_rank) { Worker(m_name, m_age, m_Id); rank = m_rank; } uint Worker::getRank() { return rank; } void Worker::setRank(uint m_rank) { rank = m_rank; } void Worker::workerInfo() { cout << "name:" << name << ",age:" << age << ",id:" << Id << ",rank" << rank << endl; }
注意也可以直接添加现有的头文件和源文件,只需要向Worker类一样引入头文件#include "MyLib_global.h"并在类定义中添加MYLIB_EXPORT。
-
随后保存构建项目,在构建设置中,找到构建目录,项目构建完成后,会在该目录下生成"MyLib.dll"文件
调用动态库
-
新建一个Qt项目,命名为"LoadMyLib"
-
项目创建完成后,将动态库中的头文件放在项目路径中,必须包含"MyLib_global.h",并加上"mylib.h"和"worker.h"
-
在项目路径创建一个lib文件夹,并存放生成的"MyLib.dll"文件
-
在LoadMyLib中添加现有文件,即"MyLib_global.h",“mylib.h"和"worker.h”
-
在LoadMyLib.pro配置文件中加上LIBS用于指示编译器链接到项目所需的静态库或动态库文件(.so、.dll),注意这里的路径时相对于项目的构建目录的,一定要正确配置路径。
-
在主程序中引入需要的头文件,并编写测试代码
-
构建Qt项目,但此时编译运行没有结果,还需要在项目的构建路径中放入"MyLib.dll"文件
-
此时重新构建项目,并运行,就能够看到如下运行结果,说明调用动态库成功。