写在前面:在家待就业了接近半年,终于忍不住去找了份工作去尝试一个人的生活。这第一份正式工作是做机床模拟切割的软件开发,虽然不是传统的互联网工作,但因为是C++开发,工作也还算对口吧。因为疫情原因自己的实习被鸽,所以这算是我第一次上班,结果刚来就被带进了一个大项目;要求看一份进万行的工程源码;boss也对我期望很大(各种暗示好好工作);每天的自己就像被赶着去屠宰的鸭子一样。哎!苦也没办法,青春饭就是如此。如今好不容易项目有了阶段性成果,不如乘此机会记录下一路上踩到的各种坑,不仅加深记忆,也勉励一下未来的自己吧!如果能顺便解决网友们的疑惑,那更是不胜荣幸!(上班摸鱼打出来的,无图见谅,哈哈哈_)
任务目标与现有资源
- 现有一份开源的三维空间物体布尔操作(交并差计算)vs工程,要求将他移植到QT平台,即完成vs工程到qt工程的移植。
- 环境配置如下:
- 电脑配置:2核4G内存64位win7,不能上网。
- 开发软件:vs2012/2015,QT5.14/5.12。
- 可选编译器:MSVC2015·64位,mingw64位。
兼容问题:“constexpr:函数不会生成常数表达式”
问题描述:当QT调用visual studio里的msvc编译器时,无论什么工程都会报出如此错误。错误的文件是Qobjectdefs.h,是QT的核心文件之一。
解决过程:看来是老版本的QT还有VS存在一定的兼容问题。网上能查到的错误是错在Qalgorithm.h里的,还不一样。不过网上的那个有给出官方社区里修改源码的办法,我去看了一下,我的Qalgorithem已经和修订版一样了啊,于是便想能不能在那个社群里找到Qobjectdefs的修改版呢?然而并没有,哈哈。
解决方法:最后找boss求来了vs2015和QT5.12,一个更新一个更老,问题得到解决。要注意的是QT安装时,要勾选相对应VS版本的msvc编译器。
VS Kits问题:“无法找到Visual Studio 20__(v1_0)的生成工具”
问题描述:打开那个开源工程的sln文件后,爆出如上错误,vs无法继续正常生成和运行的工作。
解决过程:这个很好理解,作者当初编写程序的时候用的vs工具集和我的不一样,改一改就是了。
解决方法:菜单栏项目—设置,或者解决方案资源管理器里右键项目—设置,在配置属性—常规—常规中找到平台工具集一项,会显示为Visual Studio 20__(v1_0)(未安装),点击它在下拉框里找到自己电脑里有的随便一个就行,再点击应用即可。
工程迁移问题:VS工程转换为QT Creator工程
问题描述:既然是要做VS工程转QT平台,能让宇宙第一IDE的VS自动完成的事情何必亲自动手呢?网上查到VS果然有QT的相关插件QT VS TOOLS(能联网的可以直接在vs工具-扩展和更新里下)。让boss下好传给我后双击vs自动安装,重启vs后菜单栏里有了Qt VS Tools项,那么直接Create Basic.pro file生成Qt Creator工程文件,然后Convert custom builds steps to Qt/MsBuild不就能直接工作完成了——个屁。Qt Vs Tools里这些选项全他妈是黑的!
解决过程:其实也很好理解,分布过程如下:
- 首先,Qt VS Tools里点Qt Options,看看有没有自动检测到Qt版本,如果全空的话点击Add添加,Path里选择(QT安装路径)/(qt版本号)/(msvc20xx64或32)这个路径,VS会找到里面的Qmake程序并自动填写Options里剩下的内容。让Vs和你的Qt真正的“联系”起来。
- 其次,在新建项目里多了新建Qt项目的选项,随便创一个空项目,会发现这个Qt项目居然没有Qt Creator的配置文件.pro,再看看Qt VS Tools,发现它那些转换选项都能用了。那现在真相大白了:网上说的那些用Qt VS Tools的博客不是骗人,而是因为这方法只能用来转换VS创建的QT工程,而不能直接转换普通的C++工程。
解决方法:修改工程的配置文件,让VS相信这是能转换的玩意就行。参考如是网页,用文本编辑器打开源工程的vcxproj文件,找到PropertyGroup Label="Globals"的配置群,在里面添加标签Keyword,内容是Qt4VSv1.0(记得标签闭合),保存后重新打开VS工程,就可以进行上面的操作啦。实际操作中KeyWord里时QT4还是5,VSv1.0还是2.0没多大关系,VS会自动帮你修正的(比如我的就变成了QTVS_v303)。
库配置问题:第三方库的编译和添加
问题描述:在研究的这份代码工程里,包含了一个用于大数据计算的第三方库Mpir,源自于Linux环境下开发的同门师兄GMP库。Mpir下载来的源码是sln工程,用VS编译后便能直接使用了。但是随着工程都移植到QT后这也出现了问题:因为VS编译采用的是MSVC,生成的静态库是.lib文件;QT要用的编译器是MINGW,采用的库文件格式是libxxx.a,二者不一样,所以需要重新编译并手动添加。
解决过程:Mpir的源码工程有点独特,它根据目标处理器的不同分了好几个子工程,子工程文件夹里只有sln和工程配置文件,所有工程需要的代码文件统一保存在一起,以至于更换编译器编译存在一定的困难。更适合的解决方法是改用linux开发的GMP库,并使用MINGW编译。要注意位数要和原工程统一,不然会调用函数失败。
解决方法对于linux开发的第三方库,一般只需要执行如下命令:
./configure
make
make install
编译生成库文件后,放入工程目录,打开pro文件开始编辑:
LIBS += -L$$PWD/(库文件夹名) -l(库名1) -l(库名2)……
INCLUDEPATH+= $$PWD/库文件夹
DEPENDPATH += $$PWD/库文件夹
其中,$$PWD是pro文件所在目录,-L让QT确认库目录,-l确认特定的库,第一句确定要添加的库;第二第三句确认对应的.h和依赖路径,这样就足够了。如果用QT自带的添加库功能的话,会报出不是win32支持的可执行文件的错误,所以来说还是自己编写pro文件靠谱!