Ubuntu16.04安装Qt+qwt+fftw

前端之家收集整理的这篇文章主要介绍了Ubuntu16.04安装Qt+qwt+fftw前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文参考网上诸多文章集合而成,重点有如下几篇,特此感谢。
Qt和qwt安装:
https://www.jianshu.com/p/afbc42ad2cfd
https://blog.csdn.net/lsjtsj/article/details/20313075
https://blog.csdn.net/ShoneX98/article/details/74012335(好)
FFTW库安装:
https://blog.csdn.net/whhxp/article/details/54375339
https://blog.csdn.net/wbgxx333/article/details/36625977
https://blog.csdn.net/eric88/article/details/17055325
https://blog.csdn.net/zwjzwj108108/article/details/24254067(好)
https://blog.csdn.net/congwulong/article/details/7576012(API)
注:关于添加全局变量,有时候需要重启生效,笔者未自己研究,欢迎大家一起验证。

本次操作环境为: Ubuntu 16.04 x64
安装QT版本:
前提:执行以下命令,保证安装所需的库,主要原因是:

  1. QT5系统缺少lGL图形链接
  2. QT从5.8开始,编译工具就必须要支持C++11标准的才行,而GCC版本4.8以上才支持这个标准。
sudo apt-get install g++
sudo apt-get install build-essential 
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libglu1-mesa-dev freeglut3-dev

一、Qt安装

Qt版本选择的是:Qt 5.9.1 64位版本

在Linux环境下搭建Qt开发环境有两种方式:一种是图形界面的安装,另一种是源代码的安装。这里为了方便,快速开发,使用基于图形界面方式。
下载版本:

步骤:

  • 在QT官网下载Qt安装包,这里下载qt-opensource-linux-x64-5.9.1.run,注意Qt5.9.1linux版本的只有64位,这是因为QT官方从Qt5.5以后不再支持32为版本。
  • 执行如下命令:
sudo chmod +x qt-opensource-linux-x64-5.9.1.run

说明:该命令是为了给为Qt安装包赋予可执行的权限。

  • 然后再执行如下命令:
sudo ./qt-opensource-linux-x64-5.9.1.run

此时会弹出图形化的安装界面,之后的操作就跟Windows下安装软件相类似。

这里使用root权限安装是因为要安装在默认目录/opt下,当然也可以选择普通用户安装。

需要说明的是:qt-opensource-linux-x64-x.x.x.run包中包含了QtCreator可视化的开发工具,在安装完后,找到安装目录下的Tools/QtCreator/bin目录下发现有QtCreator可执行文件,该文件就是Qt可视化的开发工具。

  • 最后,添加qt环境变量
    qmake这个命令需要进行环境变量的配置才能找到并执行。具体做是在当前用户的主目录下面编辑对应的.bashrc文件
    执行如下命令:
cd
vim .bashrc

然后,在该文件末尾添加如下语句:

export PATH="/xxx/xxx//Qtx.x.x/x.x/gcc/bin":$PATH

中间的路径即为Qt中qmake的绝对路径。编辑完成后保存退出Vim(:wq)。然后再执行如下命令:

source .bashrc

设置即可生效。
注:这里我并不是这样使用的,.bashrc仅仅对普通用户生效。由于qt采用了root权限安装,因此,这里root权限添加vim /etc/profile,在普通用户模式下也生效,最后source即可。

sudo gedit /etc/profile
export PATH=$PATH:/opt/Qt5.6.0/5.6/gcc_64/bin
source /etc/profile

2)Linux下Qt编程(命令方式):Hello Qt!
1.新建文件夹:mkdir hello,在文件夹下创建文件: vim hello.cpp
2.在hello.cpp中输入代码

#include <QApplication> 
#include <QLabel> 

int main(int argc,char *argv[])  
{
    QApplication app(argc,argv);
    QLabel *label=new QLabel("Hello QT!");
    label->show();
    return app.exec();      
}

3.在终端下输入命令:qmake -project ,生成工程文件。此时在hello文件夹下生成hello.pro文件
4.在终端下输入命令:qmake hello.pro,生成Makefile
5.在终端下输入命令:make ,进行编译。生成hello可执行文件
6.在终端下输入命令:./hello ,运行程序。

二、Qwt安装

Qwt,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等等。该工具库基于Qt开发,所以也继承了Qt的跨平台特性。

安装好qt
开发环境后,先去其主页下载qwt库源代码
1、下载qwt,注意是ubuntu下安装,我下载的是后缀为tar.bz2版本

网址:https://sourceforge.net/projects/qwt/files/qwt/6.1.3/

2、解压后拷贝到/usr/local/下,用Qtcreator打开qwt.pro文件,注意选择qmake的版本(因为Ubuntu默认环境下有一个qt版本,所有要选择我们刚刚安装的qmake)。
注意到官方安装文档有这么一句话:

Platforms
Qwt 6.1 might be usable in all environments where you find Qt. 
It is compatible with Qt4 ( >= 4.4 ) and all Qt5 versions.

这里我们Qwt版本是6.1.3,Qt使用5.9版本,是满足条件的。
然后->clean all (清除)-> run qmake(构建) ->build qwt

3、终端进入qwt.6.1.3目录,cd /usr/local/qwt6.1.3

使用5.9版本的qmake执行qmake,注意此时要进入相应qmake版本的目录,我这里使用命令:

/opt/Qt5.9.1/5.9.1/gcc_64/bin/qmake

这一步可以生成Makefile文件
4、接下来在qwt6.1.3目录下看到Makefile文件后,执行make,然后执行sudo make install,注意可能会出现小警告,我这里忽略了

make
sudo make install

这样就完成qwt6.1.3的安装了,安装的路径是/usr/local/qwt-6.1.3。
2) 添加qwt库路径到链接器的路径当中。使用了qwt库的程序会链接到libqwt.so库,而这个库安装路径并不在系统环境变量内,所以要自己添加其路径。

#编辑~/.bashrc在最后一行加上
export LD_LIBRARY_PATH=/usr/local/qwt-6.1.3/lib
source ~/.bashrc

3)example测试成功
由于上面的编译过程没有自动编译示例程序,需要我们手动编译
所有示例程序都放在qwt-6.1.3/examples/目录下,执行下面的命令:

cd examples
/opt/Qt5.9.1/5.9.1/gcc_64/bin/qmake  #生成Makefile
make

编译后的所有可执行程序就放在qwt/examples/bin/目录下。

5、拷贝lib文件

sudo cp /usr/local/qwt-6.1.3/lib/*   /opt/Qt5.9.1/5.9.1/gcc_64/lib

6、拷贝so文件添加插件
首先确认生成的so文件

cd /usr/local/qwt-6.1.3/plugins/designer/
ldd libqwt_designer_plugin.so (该文件仅root是rwx权限,链接了libqwt.so.6

注意,这里我之前犯的错是将so文件拷贝错了地方,应该是要拷贝到qtcreator的designer文件夹下,我拷贝到qt的designer目录下,显示不出来效果。正确的命令如下:

sudo cp /usr/local/qwt-6.1.3/plugins/designer/libqwt_designer_plugin.so  /opt/Qt5.9.1/Tools/QtCreator/lib/Qt/plugins/designer

这一步我出错了无数次,一定是在qt的designer目录下,而不是qt的gcc_64下面的lib,如果安装在那个下面,在以qt设计师方式打开.ui文件时会出现Failed get Meta data错误

7、打开Qtcreator,双击打开一个ui文件,看designer有没有qwt控件。若没有,可以在ui界面下,单击tool菜单 ->form editor ->about Qt designer plugins下点击refresh,应该会有qwt插件,恭喜,安装成功!

8、在自己的项目中使用qwt时,需要在自己项目的pro文件添加

INCLUDEPATH += /usr/local/qwt-6.1.3/include  
LIBS += -L "/usr/local/qwt-6.1.3/lib/" -lqwt

三、Fftw安装

FFTW(the Fastest Fourier Transform in the West)库是由MIT(Massachusetts Institute of Technology)的Matteo Frigo和Steven G. Johnson开发的,用于一维和多维实数或复数的离散傅里叶变换。
下载fftw-3.3.5版本,解压缩文件

ftp://ftp.fftw.org/pub/fftw/fftw-3.3.5.tar.gz
tar zxvf fftw-3.3.5.tar.gz

在Linux中安装FFTW:
总共需要两次安装
第一次安装就按下面的 a 配置就行
第二次安装时为了 生成libfftwf.so的库文件 以f结尾的代表可以的数据类型是 float 加上 --enable-float 第一次安装的时候不能加这个选项,否则会出错。
a.

./configure --enable-type-prefix --prefix=/usr/local/fftw 
--with-gcc --disable-fortran --enable-i386-hacks  --enable-shared=yes

其中,
–enable-type-prefix 参数是为了同时使用single precision(单精度)和double precision(双精度),如果不使用它,最后只有以rfftw开头的文件被安装(real fftw);
–prefix= 参数是设定安装目录;
–with-gcc 使用gcc编译器;
–disable-fortran 参数为了不包含Fortran调用的机制;
–enable-i386-hacks 为Pentium和x86以后的cpu优化gcc的编译速度。
–enable-shared=yes 为了生成动态库.so文件 否则生成的都是.a 文件 没法编译 (我就卡在这里)

第一次安装

#配置
./configure  --enable-type-prefix --prefix=/usr/local/fftw 
--with-gcc --disable-fortran --enable-i386-hacks --enable-shared=yes
#编译
sudo make
#安装,这一次安装完后,在安装目录中存在以dfftw和drfftw开头文件,但没有sfftw开头的文件
sudo make install
# 还需要安装一次,先清除
make clean

第二次安装

#其中,--enable-float      为了生成单精度计算的头文件和库文件,即以sfftw开头的文件
./configure --enable-float --enable-type-prefix --prefix=/usr/local/fftw 
--with-gcc --disable-fortran --enable-i386-hacks --enable-shared=yes
#重新编译
sudo make
sudo make install
#再一次安装,安装完后,目录中便会同时存在sfftw和dfftw开头的文件(用于复数函数
/complex function的FFT变换)和srfftw与drfftw开头的文件(用于实数函数的FFT变换)

测试

#include <complex>
#include <fftw3.h>
#include <math.h>
#include <iostream>

#define N 10
using namespace std;
int main(int argc,char * argv[]){

    fftw_complex in[N],out[N];
    fftw_plan p;
    p=fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_MEASURE);
    for(int i=0;i <N;i ++) {
        in[i][0]=i;
        in[i][1]=0.0;
    }


    fftw_execute(p);

    for(int i=0;i <N;i ++){
        cout<<out[i][0]<<" "<<out[i][1]<<endl;
    }
    complex<double> temp = 0.0;
    for(int k =0; k < N; k ++){
        double pi = 4*atan(1.0);
        temp += exp(complex<double>(0.0,-2.0*pi*3*k/N))*complex<double>(in[k][0],in[k][1]);
    }
    cout<<"out[3] is "<<temp<<endl;

    fftw_complex out1[N];

    fftw_plan p1;

    p1=fftw_plan_dft_1d(N,out1,FFTW_BACKWARD,FFTW_MEASURE);

    for(int i=0;i <N;i ++){
        out1[i][0]=out[i][0];
        out1[i][1]=out[i][1];
    }

    fftw_execute(p1);
    for(int i=0;i <N;i ++){
        cout<<in[i][0]<<" "<<in[i][1]<<endl;
    }



    fftw_destroy_plan(p);
    fftw_destroy_plan(p1);
    return 1;
}

使用如下命令检查并运行

g++ test.cpp -o test -lfftw3 -I /usr/local/fftw/include -L/usr/local/fftw/lib
ldd test
 ./test

然后在自己的程序中使用qwt库,

/opt/Qt5.9.1/Tools/QtCreator/bin/qtcreator

建立testQT工程。
只需要修改一下.pro文件即可加上如下两句:

INCLUDEPATH += /usr/local/fftw/include
LIBS += -L"/usr/local/fftw/lib" -lfftw3

使用下面代码测试

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <complex>
#include <fftw3.h>
#include <math.h>
#include <iostream>

using namespace std;

int main(int argc,char *argv[])
{
    QApplication a(argc,argv);
    MainWindow w;
    w.show();
    int N = 151;
        fftw_complex *in,*out;
        fftw_plan p;
        //add code;
        in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
        out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
        p = fftw_plan_dft_1d(N,FFTW_ESTIMATE);
        //add code;
        for (int i = 0; i < N; i++)
        {
            in[i][0] = sin(i);//real
            in[i][1] = 0;//image
        }
        fftw_execute(p); /* repeat as needed */
        //add code;
        for (int i = 0; i < N; i++)
        {
            qDebug()<<out[i][0]<<","<<out[i][1];
        }
        fftw_destroy_plan(p);
        fftw_free(in); fftw_free(out);
        qDebug()<<"bye";
    return a.exec();
}

C++版本:

#include <complex>
#include <fftw3.h>
#include <math.h>
#include <iostream>

using namespace std;
int main(int argc,char * argv[]){  
    int N = 151;
        fftw_complex *in,FFTW_ESTIMATE);
        //add code;
        for (int i = 0; i < N; i++)
        {
            in[i][0] = sin(i);//real
            in[i][1] = 0;//image
        }
        fftw_execute(p); /* repeat as needed */
        //add code;
        for (int i = 0; i < N; i++)
        {
            cout<<out[i][0]<<","<<out[i][1]<<endl;
        }
        fftw_destroy_plan(p);
        fftw_free(in); fftw_free(out);
        cout<<"bye";

    return 1;
}

附錄:

数据类型

FFTW有三个版本的数据类型:double、float和long double,使用方法如下:

  • 链接对应的库(比如libfftw3-3、libfftw3f-3、或ibfftw3l-3)
  • 包含同样的头文件fftw3.h
  • 将所有以小写”fftw_”开头的名字替换为”fftwf_”(float版本)或”fftwl_”(long double版本)。比如将fftw_complex替换为fftwf_complex,将fftw_execute替换为fftwf_execute等。
  • 所有以大写”FFTW_”开头的名字不变
  • 函数参数中的double替换为float或long double

此時:
上述qt的float版本:

#include "mainwindow.h"
#include <QApplication>
#include <QFontDatabase>
#include <QApplication>
#include<QtWidgets/QPushButton>
#include <QPushButton>
#include<QtWidgets/QVBoxLayout>
#include<QtCore/QTextCodec>
#include <QDebug>
#include <complex>
#include <fftw3.h>
#include <math.h>
#include <iostream>

int main(int argc,argv);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    a.setFont(QFont("STKAITI",80));


            int N = 151;
            fftwf_complex *in,*out;
            fftwf_plan p;
            //add code;
            in = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * N);
            out = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * N);
            p = fftwf_plan_dft_1d(N,in,out,FFTW_ESTIMATE);
            //add code;
            for (int i = 0; i < N; i++)
            {
                in[i][0] = sin(i);//real
                in[i][1] = 0;//image
            }
            fftwf_execute(p); /* repeat as needed */
            //add code;
            for (int i = 0; i < N; i++)
            {
                qDebug()<<out[i][0]<<","<<out[i][1];
            }
            fftwf_destroy_plan(p);
            fftwf_free(in);
            fftwf_free(out);
            qDebug()<<"bye";
    MainWindow w;
    w.show();
    return a.exec();
}

验证后,发现float的精度误差和double相比还是有一些的。

qt中验证通过,交叉编译后 将fftw3.h拷贝到qt_lib的include目录下 将libfftw3f.so.3,libfftw3f.so.3.2.4拷贝到qt_lib的lib目录下 在arm环境下更新环境变量,然后测试

猜你在找的Ubuntu相关文章