谨以此文来记录一个小白花了一天时间的心路历程hhh,深感在windows下环境不好配置。(4.16补充,花了三天,之前高兴的太早了)
最近得到师兄的一个在Windows下用qmake写的qt程序,我需要在里面添加一些功能。首先是由于Qt版本不对出现了一大堆bug,因为qt在第六版有了重大的升级,很多类改变了。所以最后通过卸载重装我的qt版本到5.14得到解决。(感谢陆师兄的建议,要不然我会折腾死)。
然后我就需要在里面装一个非线性优化库Nolpt。以下是具体心路历程hhh。
整体教程参考NLopt的windows环境下安装,但是每一步都会遇到不少的问题hhh,我们从第一步开始。
1 c/c++环境配置
教程言:【需要使用到的工具有cmake和MinGW,具体安装教程请自行搜索,网上有很多】
好吧那我们开始,之前下载过cmake比较熟悉,直接在网上搜索camke重新下回来安装。然后对nolpt进行cmake发现编译器没有,那就意味着我要再下一个编译器(奇怪的是在终端gcc -v是能看到我的编译器的,但是是一个什么strawberry。。这是电脑什么时候背着我种的草莓?而且电脑上其他vs c++编译器也还是有的,为什么用不了。。)。总之就再下一个吧,MinGW比较轻便,那就是你了!
MinGW编译器的安装(4.16日补充,应该直接用qt的编译器,见补充)
1.踩坑:不要直接下载他的安装器进行安装,当时就是看着这个教程MinGW下载和安装教程进行安装的,然后cmake在conifgue时就一直报错缺少一个什么dll文件,找寻未果直接放弃。
2.可用方法:找到了教程下载安装MinGW-w64详细步骤(c/c++的编译器gcc的windows版,win10真实可用)按照这个一步一步来就可以了
2 下载并编译Nolptr库
首先按照教程下载所需的Nolpt安装包,下载解压之后进行cmake。
在windows环境下使用cmake
在linux下cmake直接在终端中使用make、cmake命令行即可完成构建,但是在windows中,还是较为麻烦,所以我直接用的是Cmake-GUI,试图可视化的进行cmake操作。
1.在configue时,设置如下:
之后弹出的窗口选择上面刚刚下载的MinGW的编译器位置:
然后就正常了。
2.然后Generate,很高兴这次他没有出错。
3.不过注意此时并没有直接安装了Nolpt,cmake生成的是一个makefiles的可执行文件。这个文件是让你安装Nolpt库的程序。
需要在你build的文件夹里在终端输入mimgw32-make。
4,成功之后需要管理员身份打开cmd,重新进入到build文件夹下,输入mingw32-make install,可以看到,默认安装到C盘Program Files(x86)文件夹下。(关于如何在终端进入到build文件夹下,参考这个教程【windows终端路径跳转】windows终端cd不了其他文件夹解决方法)
到此,Noplt库已经安装完成啦!距离调用就差临门一脚了。
3 在Qmake中正确调用生成的Nolpt库
因为师兄此程序是qmake编写的而不是cmake,所以需要在qt的pro文件里实现对库的调用声明。
在此处,我最后通过询问了chat-GPT完成了任务:
GPT说在 QMake 中使用外部库需要以下步骤:
在 .pro 文件中使用 LIBS 变量添加库的链接器选项,使用 INCLUDEPATH 变量添加头文件搜索路径。
确保库文件位于系统库搜索路径中,或者在 LIBS 中使用完整的库文件路径。
下面是一个简单的示例,展示了如何在 QMake 中使用 nlopt 库:
(在细节处已经过人工修改)
1 | # .pro 文件 |
你可以根据自己的实际情况修改示例中的目录路径和文件名称。
由于我想把库和项目放在一起,就将默认安装到C盘Program Files(x86)文件夹下的nolpt文件复制到了项目的include文件夹中,并且使用了如下代码调用:
1 | # .pro 文件 |
这里的$$PWD是项目的路径,最终完成了该库的调用。(4/16日补充 其实还是没有完成调用,生成的动态链接库经过多次试验还是没有完成调用,最终完成的是静态库的调用,具体细节见补充)
4月16日补充
在经过上述操作之后,在qt里还是无法正常运转,显示的是程序异常终止,搜索得知还是库的问题,最后通过改成编译静态库完成。其中注意事项如下:
1 库的编译器和qt的编译器要一致
库的编译器和qt的编译器不一致的时候会报出不兼容的问题。解决方法是,在使用cmake编译的时候,直接使用qt的编译器(在qt的目录下,tools的文件夹里,找到MinGW文件夹里的GCC和G++.exe文件进行编译)。
2 如何编译静态的库
在cmake-GUI的configure之后,使用search功能,搜索share,我们可以看到在图中的这个BUILD_SHARED_LIBS选项上打勾了,这是代表生成动态库。而我们如果取消勾选,就可以生成静态库。
生成的静态库,也是按照之前的方法在qt里面调用:
1 | # .pro 文件 |
最后终于完成了一个库的调用。
总结
windows下安装个库是真的不好用,对比一下在上一篇博客中在linux下调用简直太复杂。动态链接库更是要命,最后还是推荐使用静态链接库。
另外推荐一下学习nolpt库的博客NLopt–非线性优化–原理介绍及使用方法;NLopt–非线性优化–算法使用及C++实例。怕自己到时候在想不起来。



