设为首页 加入收藏

TOP

Qt 共享库(动态链接库)和静态链接库的创建及调用(一)
2018-10-21 18:09:55 】 浏览:160
Tags:共享 动态 链接 静态 创建 调用

前言: 编译器 Qt Creator, 系统环境 win7 64 位

 

1.创建共享库:

新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sharedlib)

生成的目录结构如图:

修改 sharedlib.h 中的代码:

// sharedlib.h
#ifndef SHAREDLIB_H
#define SHAREDLIB_H #include "sharedlib_global.h" class SHAREDLIBSHARED_EXPORT Sharedlib// 导出类, 客户端可直接加载 { public: Sharedlib(); void test(); }; extern "C" Q_DECL_EXPORT int add(int a, int b);//导出函数, 客户端可用 QLibrary 加载 #endif // SHAREDLIB_H

 

修改 sharedlib.cpp 中的代码:

// sharedlib.cpp
#include "sharedlib.h"

#include <QMessageBox> Sharedlib::Sharedlib() { } void Sharedlib::test() { QMessageBox::warning(0, "Sharedlib::test", "Sharedlib::test"); } int add(int a, int b) { return a+b; }

 

2.调用共享库(方式一):

新建文件或项目->选择 Application, Qt Console Application->项目名为 app1->下一步

修改客户端程序 main.cpp 中的代码:

// main.cpp
#include <QCoreApplication>
#include <QLibrary> #include <iostream> using namespace std; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); typedef int (*Add)(int a, int b); QLibrary mylib("sharedlib.dll"); if(!mylib.load()){// 加载 dll 失败 cout<<"加载 sharedlib.dll 失败!"<<endl; return -1; } Add add = (Add)mylib.resolve("add"); if(0 == add){// 加载失败 cout<<"加载函数 add 失败!"<<endl; return -1; } int sum = add(1,2);// 调用 add 函数  cout<<sum<<endl; return 0; return a.exec(); }

 

编译 sharedlib 工程和 app1 工程-> 将生成的 sharedlib.dll 文件复制到 app1.exe 所在目录中->运行 app1.exe 输出 3

总结:这种调用方式需要在客户端程序编译时需要提供 .dll 的名字信息及其函数信息, 需要在客户端程序运行时提供 .dll 文件, 客户端中要写的代码较多.

3.调用共享库(方式二):

新建文件或项目->选择 Application, Qt QWidgets Application->项目名为 app2->下一步

在 app2.pro 文件最后添加如下代码, 用来说明 sharedlib.lib 的路径信息:

unix|win32: LIBS += -L$$PWD/../build-sharedlib-unknown-Debug/debug/ -lsharedlib

INCLUDEPATH += $$PWD/../build-sharedlib-unknown-Debug/debug DEPENDPATH += $$PWD/../build-sharedlib-unknown-Debug/debug

 

将 sharedlib 工程源码目录下的 sharedlib.h 和 sharedlib_global.h 头文件复制到 app2 工程源码目录下, 将 sharedlib.dll 文件复制到 app2.exe 所在目录中

修改客户端程序 main.cpp 中的代码:

// main.cpp
#include "mainwindow.h"
#include <QApplication> #include "sharedlib.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); // MainWindow w; // w.show();  Sharedlib sb; sb.test(); return a.exec(); }

 

编译 app2 工程, 运行 app2.exe, 弹出如图对话框, 表示程序正确执行:

总结: 这种调用方式需要在客户端程序编译时提供 .lib 和 .h 文件, 需要在客户端程序运行时提供 .dll 文件,  客户端中要写的代码较少.

4.方式一和方式二调用共享库的异同点:

客户端程序运行时都是只需要 .dll 文件; 编译时有些差别, 方式一代码较多, 但无需 .lib 和 .h 文件, 方式二代码简单(和调用普通类一样), 但是需要 .lib 和 .h 文件.

创建好三个项目后的文件结构如图:

5. 静态链接库的创建:

新建文件或项目->选择 Library 和 c++ 库->选择静态链接库->下一步(工程名为 staticdlib)

修改 staticlib.h 中的代码:

// staticlib.h
#ifndef STATICLIB_H
#define STATICLIB_H


class Staticlib { public: Staticlib(); void test(); }; #endif // STATICLIB_H

 

修改 staticlib.cpp 中的代码:

// staticlib.cpp
#include "staticlib.h"
#include <iostream>
using namespace std; Staticlib::Staticlib() { cout<<"Staticlib::Staticlib"<<endl; } void Staticlib::test() { cout<<"Staticlib::test"<<endl; }

 

编译工程之后会生成 staticlib.lib 文件

6. 调用静态链接库:

新建文件或项目->选择 Application, Qt Console&nbs

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇skynet源码分析之service_logger.. 下一篇一段有意思的fork()程序

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目