如何在Qt中导入nlopt库(windows环境)

谨以此文来记录一个小白花了一天时间的心路历程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时,设置如下:
cmake1
之后弹出的窗口选择上面刚刚下载的MinGW的编译器位置:
cmake2
然后就正常了。
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
2
3
4
5
# .pro 文件
# 添加头文件搜索路径
INCLUDEPATH += D:/xxx/include #这里直接指向.h文件
# 添加库链接器选项
LIBS += -LD:/xxx -lnlopt #这里指向动态链接库dll文件

你可以根据自己的实际情况修改示例中的目录路径和文件名称。

由于我想把库和项目放在一起,就将默认安装到C盘Program Files(x86)文件夹下的nolpt文件复制到了项目的include文件夹中,并且使用了如下代码调用:

1
2
3
# .pro 文件
$ INCLUDEPATH += $$PWD/include/nlopt/include/
$ LIBS += -L$$PWD/include/nlopt/bin -lnlopt

这里的$$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选项上打勾了,这是代表生成动态库。而我们如果取消勾选,就可以生成静态库。
cmake3
生成的静态库,也是按照之前的方法在qt里面调用:

1
2
3
# .pro 文件
$ INCLUDEPATH += $$PWD/include/nlopt/include/ #头文件位置
$ LIBS += -L$$PWD/include/nlopt/lib -lnlopt #.a文件位置

最后终于完成了一个库的调用。

总结

windows下安装个库是真的不好用,对比一下在上一篇博客中在linux下调用简直太复杂。动态链接库更是要命,最后还是推荐使用静态链接库。
另外推荐一下学习nolpt库的博客NLopt–非线性优化–原理介绍及使用方法;NLopt–非线性优化–算法使用及C++实例。怕自己到时候在想不起来。

自学C++

在windows环境下使用cmake构架的qt开发

教程

发现了中科大刘利刚老师发布的一门课程如何自学《计算机图形学》& C++面向对象编程?,该课程非常全面,既有b站视频又有课后练习资料,在github上又有一步一步的资料,属实是新手的福音了,先看着学一下。

进度

  1. 通过第一二节的课程学习和练习,大致了解了C++的编写框架:通过声明和定义不同的类(.h .cpp文件),也算是理解了面向对象编程的含义哈哈哈。
  2. 大致知道了Qt的一些特点,包括自带的Qt类和信号槽等。
  3. 还没看完,跑路了,期待后续更新吧。

在linux环境下使用cmake构架的c++开发

在师兄的推荐下,选择了在linux下的C++编程。因为linux下的环境配置非常方便,在经过体验后发现确实如此,都是都是血泪史,具体会在后面的博客细说hhh。

教程

找到了b站上一位大佬xiaobing1016的非常干货课程基于VSCode和CMake实现C/C++开发 | Linux篇,非常详细,我花了一天时间学习这个课程,第二天就把我的matlab函数改成了c++。总之非常推荐新手学习。

进度

1.学会了vscode里如何编写c++。
2.学会了cmake的大致语法和编译命令。
3.学会了导入第三方库,如矩阵运算库Eigen和非线性优化库Nolpt。二者还不太一样,Eigen下载下来直接include一下就可以了,而Nolpt需要在系统中先进行install,然后载入。下面是cmakelist里写的具体区别。
在linux下还是较为方便的导入的。

1
2
3
$ include_directories("/usr/include/eigen3")
$ target_link_directories(项目名 PUBLIC /usr/local/lib)
$ target_link_libraries(项目名 PUBLIC nlopt)

不过到现在虽然写出来了还能跑的程序,其实还是入门阶段。对面向对象的编程还是没有更深层次的了解,还需要更深层次的学习。

微分几何笔记大纲

主要用于记录学习曲线与曲面的微分几何过程中的笔记,一般会现在b站上发布笔记然后再放到这里汇总

主要参考书籍:(Dover Books on Mathematics) Manfredo P. do Carmo - Differential Geometry of Curves and Surfaces-Dover Publications (2016)
其他参考书籍:《复杂曲面数字化制造的几何学理论合方法》 丁汉 朱利民 著
参考课程:微分几何 同济大学 贺群

大纲

曲线

正则曲线->切线->弧长->Frenet标架(活动标架)->曲线论基本公式->曲线基本定理
1

曲面

正则曲面->切平面->度量(第一基本型)->活动标架(不一定是正交的)->第二基本型(一系列曲率)->基本公式->曲面论的基本定理
2
哔哩哔哩专栏文集链接
微分几何笔记|1曲线
微分几何笔记|2正则曲面
微分几何笔记|3曲面的第一基本形式2月13更新
微分几何笔记|4曲面的第二基本形式2月14更新

使用jsDelivr加速以及踩坑解决

主要参考了这个教程jsDelivr+Github 实现免费cdn加速

问题

在进行 【5.3 将需要cdn加速的资源上传到github仓库】 时,无法更新,查询可能是什么分支没有设置好,查询了 该链接 采用了

1
git push origin master

然后就成功了

测试图片以及pdf

采用如下地址应用资源

1
https://fastly.jsdelivr.net/gh/你的用户名/你的仓库名@发布的版本号/文件路径

版本号不是必须的 可选

图片

black

pdf

发现使用jsdeliver加速的文件不能超过20m,否则会显示显示File size exceeded the configured limit of 20 MB
pdf文件过大

1
{% pdf https://fastly.jsdelivr.net/gh/zishanli/mycdn/pdf/Project1.pdf %}

一开始成功了但是有时会蹦出直接下载pdf的问题 不太好用以后还是不用pdf了hhh

测试本地和云端上传图片和pdf

本地图片和pdf

本地图片

教程见这个教程
测试效果:
white

本地pdf 在上篇文章可以看到如果文件过大效果不好 所以希望采用云端的方式

云端

将文件上传到Google drive并获取链接

上传通过图片

1
![shite](图片链接)

图片名称

在谷歌网盘上传pdf

1
{% pdf https://drive.google.com/xxx/view %}

会发现一直进行人机验证 ( ´◔ ‸◔`) 辣鸡谷歌

使用Hexo搭建个人博客使用以及踩坑补丁

主要采用了知乎上的文章 GitHub+Hexo 搭建个人网站详细教程进行了搭建,但是之中还是有一些问题,记录一下。

踩坑问题

问题1 使用localhost:4000访问本地blog一直无响应

一开始在网上看他们说是因为4000端口被占用,所以得换个端口使用,参考链接 论坛,但是怎么也没改对,弄了一晚上,最后发现应该是这个文章 GitHub+Hexo 搭建个人网站详细教程在安装Hexo之后,应该输入如下命令

1
2
3
$ hexo init blog
$ cd blog
$ npm install

然后再启动服务

1
2
$ hexo g
$ hexo s

之后打开chrome输入localhost:4000就成功了

问题2 发布hexo d时,出现了 Failed to connect to github.com port 443:connection timed out 问题

我使用的梯子是clash 应该是有些冲突,解决方法是控制台输入

1
2
$ git config --global http.proxy http://127.0.0.1:7890 
$ git config --global https.proxy http://127.0.0.1:7890

问题3 hexo博客在本地可以正常预览,部署到github上后为什么无法显示样式

参考了hexo博客在本地可以正常预览,部署到github上后为什么无法显示样式,只有内容呢?的第三个回答,可能是缓存问题,使用shift+F5强制刷新浏览器缓存就可以了