说明

使用 QCustomPlot 绘图库辅助开发时整理的学习笔记。同系列文章目录可见 《绘图库 QCustomPlot 学习笔记》目录。本篇介绍 QCustomPlot 的一种使用方法,通过动态库的方式进行使用,示例中使用的 QCustomPlot 版本为 Version 2.1.1

1. 下载源码

详见本人另一篇博客 【QCustomPlot】下载,下载 QCustomPlot-sharedlib.tar.gz 动态库版的压缩包,解压后里面有个 readme.txt 文件,介绍了如何编译 QCustomPlot 动态库以及如何使用编译出来的动态库,本篇博客将以此为参考,介绍如何通过动态库的方式使用 QCustomPlot 绘图库。编译动态库时,需使用到 qcustomplot.hqcustomplot.cpp 两个文件。使用动态库时,需把 qcustomplot.h 文件及动态库放在编译器能找到的地方,并在相关文件中通过 #include 的方式包含该头文件,而不能在 pro/pri 文件中通过 HEADERS += 的方式包含 qcustomplot.h ,否则会报错。

2. 编译动态库

编译动态库时,需三个文件:pro 文件、qcustomplot.hqcustomplot.cpp 源码文件。

2.1 编译动态库的工程文件 .pro

pro 文件用于设定动态库的编译方式及相关信息,新建一个 txt 文本文件,将以下代码拷贝进去,然后更改 .txt 后缀名为 .pro,就得到了所需的工程文件,不妨将该工程文件命名为 sharedlib-compilation.pro

QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11 DEFINES += QCUSTOMPLOT_COMPILE_LIBRARY
TEMPLATE = lib
CONFIG += debug_and_release build_all
static {
CONFIG += static
} else {
CONFIG += shared
} VERSION = 2.1.1 TARGET = qcustomplot
CONFIG(debug, debug|release) {
TARGET = $$join(TARGET,,,d)
QMAKE_TARGET_PRODUCT = "QCustomPlot (debug mode)"
QMAKE_TARGET_DESCRIPTION = "Plotting library for Qt (debug mode)"
} else {
QMAKE_TARGET_PRODUCT = "QCustomPlot"
QMAKE_TARGET_DESCRIPTION = "Plotting library for Qt"
}
QMAKE_TARGET_COMPANY = "www.qcustomplot.com"
QMAKE_TARGET_COPYRIGHT = "Copyright (C) by Emanuel Eichhammer" SOURCES += qcustomplot.cpp
HEADERS += qcustomplot.h

2.2 整理编译目录

将上面的 sharedlib-compilation.proqcustomplot.hqcustomplot.cpp 三个文件放在同一个文件夹下。

2.3 编译出动态库

使用 Qt Creator 打开 sharedlib-compilation.pro 文件,选择合适的编译器,这个编译器必须与后面使用动态库时的编译器一样,比如都为 MSVC2015 64bit。(编译时选择 Debug 模式或者 Release 模式都可以,不影响最后的使用,因为 .pro 文件里面有设置,不管是哪种模式,最后两种版本都会生成。)

点击左下角这个锤子图标,编译动态库,等待编译。

编译完成后,会在构建目录下生成动态库,我的构建目录为(因人而异):

E:\Cworkspace\Qt 5.9\QtDemo\build-sharedlib-compilation-Desktop_Qt_5_9_2_MSVC2015_64bit-Debug

该目录的 debugrelease 子目录下分别有对应版本的动态库,使用时只需要 .lib 以及 .dll 文件(不同平台编译器的生成结果会有差异)。

3. 使用动态库

使用动态库时,需把以下三个文件放在编译器能找到的地方:上一步生成的 .lib 以及 .dll 文件(不同平台编译器的生成结果会有差异,但都是一个静态库文件和一个动态库文件)、qcustomplot.h 文件。同样以 MSVC2015 64bit 为例。

3.1 在使用工程文件 .pro 中添加代码

在使用动态库的 .pro 工程文件中添加以下代码(库的路径因人而异,下面假设动态库放在了 .pro 文件同级目录下):

greaterThan(QT_MAJOR_VERSION, 4): QT += printsupport

greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11 # Tell the qcustomplot header that it will be used as library:
DEFINES += QCUSTOMPLOT_USE_LIBRARY # Link with debug version of qcustomplot if compiling in debug mode, else with release library:
CONFIG(debug, release|debug) {
win32:QCPLIB = qcustomplotd2
else: QCPLIB = qcustomplotd
} else {
win32:QCPLIB = qcustomplot2
else: QCPLIB = qcustomplot
}
LIBS += -L$$PWD -l$$QCPLIB

若使用 MinGW 编译器,生成的静态库文件名字前面可能多了 lib 三个字母,包含时需对名字做对应修改:

# Link with debug version of qcustomplot if compiling in debug mode, else with release library:
CONFIG(debug, release|debug) {
win32:QCPLIB = libqcustomplotd2
else: QCPLIB = libqcustomplotd
} else {
win32:QCPLIB = libqcustomplot2
else: QCPLIB = libqcustomplot
}
LIBS += -L$$PWD -l$$QCPLIB

添加以上代码后,就可以按正常方式使用 QCustomPlot 绘图库了。

3.2 使用注意事项

通过动态库的方式进行使用时,需注意以下几点:

  • 编译动态库时的编译器版本必须和使用动态库时的编译器版本保持一致。
  • 生成的动态库文件、静态库文件、qcustomplot.h 文件必须放在编译器能找到的地方,比如 .pro 文件所在目录、生成目录。
  • 不能使用 HEADERS += 的方式在 .pro 文件中包含 qcustomplot.h,只能通过 #include 的方式在相关文件中包含该头文件。

3.3 使用示例代码

工程文件(sharedlib-usage.pro)代码如下,其中的库由 MSVC2015 64bit 编译器生成:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport

TARGET = sharedlib-usage
TEMPLATE = app greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11 # Tell the qcustomplot header that it will be used as library:
DEFINES += QCUSTOMPLOT_USE_LIBRARY # Link with debug version of qcustomplot if compiling in debug mode, else with release library:
CONFIG(debug, release|debug) {
win32:QCPLIB = qcustomplotd2
else: QCPLIB = qcustomplotd
} else {
win32:QCPLIB = qcustomplot2
else: QCPLIB = qcustomplot
}
LIBS += -L$$PWD -l$$QCPLIB SOURCES += \
main.cpp

主函数文件(main.cpp)代码如下:

#include <QApplication>
#include <QMainWindow>
#include "qcustomplot.h" int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window; // setup customPlot as central widget of window:
QCustomPlot customPlot;
window.setCentralWidget(&customPlot); // create plot (from quadratic plot example):
QVector<double> x(101), y(101);
for (int i=0; i<101; ++i)
{
x[i] = i/50.0 - 1;
y[i] = x[i]*x[i];
}
customPlot.addGraph();
customPlot.graph(0)->setData(x, y);
customPlot.xAxis->setLabel("x");
customPlot.yAxis->setLabel("y");
customPlot.rescaleAxes(); window.setGeometry(100, 100, 500, 400);
window.show(); return a.exec();
}

工程目录结构如下:

【QCustomPlot】使用方法(动态库方式)的更多相关文章

  1. 关于C#调用非托管动态库方式的性能疑问

    最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...

  2. 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

     一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件能够指定父对象 QTimer *timer = QTime ...

  3. 万能动态库调用工具IDMA(InvokeDllMethodsAdvance)

    万能动态库调用工具IDMA 开发者:马兆瑞     QQ/微信:624762543 百度云下载链接:https://pan.baidu.com/s/1skW5W4H CSDN下载链接:http://d ...

  4. Windows下静态库、动态库的创建和调用过程

    静态库和动态库的使用包括两个方面,1是使用已有的库(调用过程),2是编写一个库供别人使用(创建过程).这里不讲述过多的原理,只说明如何编写,以及不正确编写时会遇见的问题. //注:本文先从简单到复杂, ...

  5. 解决Linux系统下程序找不到动态库的方法

    思路:一般来说,通过make命令已经将程序依赖的动态库编译出来了,通过make install命令已经将动态库安装到系统的某个路径下.找没找到动态库就看这个路径是否包含在系统默认搜索动态库的路径中,如 ...

  6. Android引入动态库so的方法

    Android引入动态库so的方法 标签(空格分隔): Android so 第三方库 为了执行效率,会将一些CPU密集性任务如音视频解码.图像处理等放入到so中,还有也会将程序关键核心部分放入到so ...

  7. .netcore在linux下使用P/invoke方式调用linux动态库

    http://www.mamicode.com/info-detail-2358309.html   .netcore下已经实现了通过p/invoke方式调用linux的动态链接库(*.so)文件 1 ...

  8. linux下添加动态链接库路径、动态库加载等方法

    linux下添加动态链接库路径的方法 2017年01月20日 10:08:17 阅读数:5596   Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libn ...

  9. linux 运行时加载不上动态库 解决方法(转)

    1. 连接和运行时库文件搜索路径到设置     库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr ...

  10. 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改

    来源连接   http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...

随机推荐

  1. Java设计模式 —— 工厂模式

    3 简单工厂模式 3.1 创建型模式 Creational Pattern 关注对象的创建过程,对类的实例化过程进行了抽象,将软件模块中对象的创建和对象的使用分离,对用户隐藏了类的实例的创建细节.创建 ...

  2. Spring @Profile注解使用和源码解析

    介绍 在之前的文章中,写了一篇使用Spring @Profile实现开发环境,测试环境,生产环境的切换,之前的文章是使用SpringBoot项目搭建,实现了不同环境数据源的切换,在我们实际开发中,会分 ...

  3. C# 从0到实战 变量的定义与使用

    变量的定义 变量本质是一种内存的占位符,使得我们可以轻松操作计算机.C#的变量声明格式是: 类型 名称 = 值: 1 //.... 2 3 int val = 0; //定义并赋值 4 5 Conso ...

  4. 如何在 .NET Core WebApi 中处理 MultipartFormDataContent

    最近在对某个后端服务做 .NET Core 升级时,里面使用了多处处理 MultipartFormDataContent 相关内容的代码.这些地方从 .NET Framework 迁移到 .NET C ...

  5. 【故障公告】被放出的 Bing 爬虫,又被爬宕机的园子

    这些巨头爬虫们现在怎么了?记忆中2022年之前的十几年,园子没有遇到过被巨头爬虫们爬宕机的情况,巨头们都懂得爱护,都懂得控制节奏,都懂得在爬网时控制并发连接数以免给目标网站造成过大压力. 从去年开始, ...

  6. 一文理解TS泛型

    当我们在编写 TypeScript 代码时,经常会遇到需要通用(Generic)的情况,这时候,泛型就是我们的好帮手了.在本篇文章中,我们将深入介绍 TypeScript 泛型的概念以及如何使用. 什 ...

  7. C# 反射 判断类型是否是列表

    1 /// <summary> 2 /// 判断类型是否为可操作的列表类型 3 /// </summary> 4 /// <param name="type&q ...

  8. python 编程规范有哪些?

    Python 编程规范主要包括代码布局.命名规范.注释规范.函数编写规范等多个方面,下面给出一些常见的编程规范及其示例代码. 1. 代码布局规范 代码布局规范主要是指代码的缩进.行宽.空行.换行等方面 ...

  9. Mastering Regular Expressions(精通正则表达式) 阅读笔记:第一章,概念

    Real Scenario(现实场景) Here's the scenario: you're given the job of checking the pages on a web server ...

  10. 数据治理之关键环节元数据管理开源项目datahub探索

    @ 目录 概述 定义 核心功能 概念 元数据应用 其他开源 架构 概览 组件 元数据摄取架构 服务体系结构 本地部署 环境要求 安装 摄取样例 摄取入门 介绍 核心概念 命令行MySQL摄取示例 配置 ...