Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法
在使用了 RTKLIB开源包自带的 rtkplot.exe后,知道了它所具有的功能,就想着如何模仿它做出一个 demo。一开始看的是之前下载的 2.4.2版本的 RTKLIB,里面是使用 Delphi开发的。由于我现在对 Qt比较熟悉,所以想着使用 Qt框架来开发这个 demo。在看源码的过程中,阴差阳错之间又去官网上重新下载了一次源码包,结果发现最新的 2.4.3版本里面就带有相关 App程序的 Qt实现。这样的话,就可以直接阅读现成的 Qt源码了。不过首先需要解决的问题是,要尝试将所给的源代码编译成功。
1.直接在 Qt creator中打开 rtkplot_qt.pro文件,配置项目属性,进入正常的工作界面。直接进行调试,则会报出如下错误。
图 1
一开始以为是 VS2015在安装时出了问题,网上找的解决方案也都是说配置环境变量。其实不然,上图中已经说明是什么问题了,是 src\debug目录下缺失 libRTKLib.a文件。
2. .a文件是 Linux系统下的静态库文件,类似于 Windows系统下的 .lib文件;同样的,Linux系统下的 .so文件是动态链接库文件,相当于 Windos系统下的 .dll文件。另外,之前在阅读 rtkplot_qt的源码时就发现,其实里面很多数据和算法的代码都是使用 src下的相应代码,所以这些可视化程序是需要调用 src库中的代码的。而调用方式就是通过将 src中的源码编译成静态链接库,供这些可视化程序使用。这一点在 rtkplot_qt.pro文件中是有所体现的,如下图所示。
图 2
3.既然知道了问题是 src\debug目录下缺失 libRTKLib.a文件,那就想办法去找到 libRTKLib.a文件并放置到该目录下即可。打开文件夹,发现 src目录下根本就没有 debug文件夹,所以我们就先新建一个 debug文件夹。接着在整个 RTKLIB源码包中搜索 libRTKLib.a文件,结果是都没有找到。既然没有现成的,那就可能需要我们自己制作一个 libRTKLib.a文件了。
4.前面说了,libRTKLib.a文件就是将 src源码编译成的静态链接库文件,而 src文件夹下正好有一个 src.pro文件。打开该文件,发现如下图所示代码
图 3
上图中的代码就是说本次 Qt项目的目的是生成一个名为 RTKLib的静态链接库文件。不过需要注意的是,windows系统下生成的是 .lib文件!直接调试该项目,报出如下错误
图 4
再查看如下图所示的编译信息后,发现问题应该是编译参数“-Wno-unused-but-set-variable” 无效导致的。百度之后,该编译参数的原意是为了忽略掉那些设置了而没有使用到的参数,但是如下图所示的写法似乎有问题,应该改成图 7所示的写法。
图 5 编译参数“-Wno-unused-but-set-variable” 所导致的的错误
图 6 编译参数“-Wno-unused-but-set-variable” 原本的书写方式
图 7 编译参数“-Wno-unused-but-set-variable” 修改之后正确的书写方式
5.清除原项目后执行 qmake,再重新调试一次,即可成功运行,弹出如下所示的对话框。
图 8
一开始我也很懵逼,咋会弹出这个界面。我知道这个界面就是相当于 C++控制台程序可以通过命令行给主函数 main传递参数,但是 src文件夹下根本就没有 main函数,里面都是函数的源码,并没有调用这些源码的函数。百度之后发现,这是因为该项目本身就是为了编译静态库文件,项目中没有可执行的主函数,所以才会弹出这个界面来选择可执行程序并输入参数。至于所需要的静态链接库文件 libRTKLib.lib,已经生成在了build-src-Desktop_Qt_5_8_0_MSVC2015_64bit-Debug\debug目录下。将该文件拷贝到 src\debug目录下,在重新编译 rtkplot_qt项目之前,需要将图 2中的代码改成下图所示。这是因为现在生成的静态库是 .lib文件,而源码的环境可能是 Linux系统,所以用的是 .a文件。需要对代码稍作修改。
图 9
清除后执行 qmake,再重新调试,又会报出如下错误
图 10
6.对于前两个错误,直接在 plotcmn.cpp文件中使用该函数报错的地方,再添加第三个参数 ndec就可以了。而第三个错误,则要将字符串指针数组 name重新定义成 常量字符串指针数组(const char*)。修改之后再次编译,又会报出如下错误。
图 11
这个问题初看很奇怪,因为报“无法解析的外部符号”一般都是链接库出了问题,而我们之前已经添加了链接库文件 libRTKLib.lib。一开始我不知道要自己编译 libRTKLib.lib文件时,曾经把图 2中的代码直接注释掉,想试一下程序能不能运行,结果报了一大堆“无法解析的外部符号”的问题。而现在在添加了链接库之后还报了这个问题,不过只报了这两个“无法解析的外部符号”。难道是 libRTKLib.lib里的确没有包含 input_tersus和 input_tersusf这两个函数?查找之后发现这两个函数是在 src/rcv/tersus.c文件中的,打开 src.pro文件,发现其 SOURCES中真的还就只缺失了 tersus.c这个文件。在 SOURCES中添加完该文件后,重新编译 src项目的静态库文件。再将第二次得到的 libRTKLib.lib替换掉 src/debug目录下的相应文件。
7.重新运行 rtkplot_qt项目,就可以成功运行啦。运行结果如下图所示
图 12 rtkplot_qt成功运行后的主界面
Bingo!
Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法的更多相关文章
- 服务器个人环境下pytorch0.4.1编译warp-ctc遇到的问题及解决方法
一.关于warp-ctc CTC可以生成一个损失函数,用于在序列数据上进行监督式学习,不需要对齐输入数据及标签,经常连接在一个RNN网络的末端,训练端到端的语音或文本识别系统.CTC论文 CTC网络的 ...
- 【thinkphp 5 在nginx 环境下路由无法生效(404 500错误 )的解决方法】
非常惭愧的说,由于之前一直使用的是windowservice,安装apache来进行服务器布置的,这种方式也是最简单最直接的方式, 但是由于php的服务大多都是linux栈的,咱们也不能落后呀,在 ...
- webpack编译时No PostCSS Config的解决方法
1. { loader:"postcss-loader", options: { // 如果没有options这个选项将会报错 No PostCSS Config found pl ...
- Win10环境下 HTTP 错误 500.19 - Internal Server Error 问题及其解决方法
记一下今日份小bug... 明天要做软件架构实验了,今天打算测试下运行web项目,于是乎,找出了以前用JSP写的web项目测试运行不了,我再打开浏览器测试Tomcat服务器,在地址栏键入http:// ...
- 关于 phpstudy环境下在MySQL中执行into outfile无法导入导出文件解决方法
之前在做sqli-labs练习,需要用到into outfile 出现以下问题: 执行SQL语句后在指定的路径下无文件生成. 例如: 执行 select into outfile "C:\\ ...
- Windows环境下使用cygwin ndk_r9c编译FFmpeg
一.废话 最近学习,第一步就是编译.我们需要编译FFmpag,x264,fdk_aac,一步步来.先来讲一下FFmpeg,网上说的很多都是几百年前的,我亲测完美可用 联系我可以直接评论,也可以加我Q ...
- Windows环境下使用cygwin ndk_r9c编译x264
一.废话 最近学习,第一步就是编译.我们需要编译FFmpag,x264,fdk_aac,下面是x264,网上说的很多都是几百年前的,我亲测完美可用 还是那句话 我能力有限,但是我希望我写的东西能够让 ...
- Windows环境下python多版本配置方案
系统环境 Windows,安装了msys2,windows和msys2都安装了python,且版本比较多,使用shell/bash聚合工具conemu64 配置方案 配置msys2环境用户目录下的.b ...
- windows环境下ElasticSearch5以上版本安装head插件
我的ElasticSearch版本是5以上的,网上搜了好多安装方式,都不对. 还好找到一个成功的,转载过来做记录. 原文地址:ElasticSearch-5.0安装head插件 步骤 下载node.j ...
随机推荐
- ssh整合(spring + struts2 + hibernate)xml版
1.1分层 1.2jar节点 <dependencies> <dependency> <groupId>junit</groupId> <arti ...
- 两个command的疑惑
1.在cqrs模式中有command和query command 命令 没有返回值,但会更改对象的状态 query 查询 有返回值 但不会改变用户的状态,对下同而言没有副作用 2.在今天的实际 ...
- jQuery三——筛选方法、事件
一.jquery常用筛选方法 以下为jquery的常用筛选方法: 代码示例如下: <!DOCTYPE html> <html lang="en"> < ...
- List的设置值,跟变量的位置关系(变量范围的变化导致结果差别很大)
我们想要的结果是: [RegnTypeCharge: null,null,null,null,1,null,null,null,null,null,null,null,null,null,null,] ...
- Java 重写hashCode() 时为什么要用 31 来计算
在OSChina 中看到了一篇文章<Java 中正确使用 hashCode 和 equals 方法>,看到 hashCode 的方法体内的31比较有意思. 在Stackoverflow上找 ...
- Jmeter性能测试 入门--转载
转载: Jmeter性能测试 入门 Jmeter是一款优秀的开源测试工具, 是每个资深测试工程师,必须掌握的测试工具,熟练使用Jmeter能大大提高工作效率. 熟练使用Jmeter后, 能用Jmete ...
- matlab练习程序(生成黑白网格)
提供了两种生成方法,一个是自己编程实现,比较灵活:另一个是调用系统的checkerboard函数,似乎只能生成8*8网格. 至于用途,也许可以用来下国际象棋. 自己函数生成: 系统函数生成: 代码如下 ...
- broadcastemit
http://code.angularjs.org/1.0.2/docs/api/ng.$rootScope.Scope#$broadcast scope可以以类似于DOM事件的方式进行事件传播.事件 ...
- 并发包java.util.concurrent.locks.Lock
** * * @描述: Lock比传统线程模型中的synchronized方式更加面向对象.与生活中的锁类似,锁本身也应该是一个对象,两个线程执行的代码片段要实现同步互排的效果 * 它们必须用同一个L ...
- patch 修改有问题的
diff --git a/include/net/tcp.h b/include/net/tcp.h@@ -1013,8 +1048,13 @@ static inline u32 keepalive ...