最近在使用vs2022进行最小二乘法计算,要用到免费的开源c++函数库nlopt,网上的教程比较陈旧,尝试了很多方法,整个过程比较艰辛,下面记录一下我的编译过程:
1.Nlopt简介(nlopt文档:NLopt - NLopt Documentation)
NLopt 是一个用于非线性优化的免费/开源库,为在线可用的许多不同的免费优化例程以及各种其他算法的原始实现提供了一个通用接口。其功能包括:
- 可从 C、C++、Fortran、Matlab 或 GNU Octave、Python、GNU Guile、Julia、GNU R、Lua、OCaml、Rust 和 Crystal 调用。
- 许多不同算法的通用接口 - 只需更改一个参数即可尝试不同的算法。
- 支持大规模优化(一些算法可扩展到数百万个参数和数千个约束)。
- 全局和局部优化算法。
- 仅使用函数值(无导数)的算法,以及利用用户提供的梯度的算法。
- 用于无约束优化、边界约束优化和一般非线性不等式/相等约束的算法。
- GNU LGPL 下的自由/开源软件(以及 NLopt 某些部分的宽松许可证)。
2.需要做的下载安装准备
2.1下载安装cmake,并将其配置在系统环境中,具体cmake安装网上教程很多,可以自己去找,下面是我参考的一篇文章,侵权删除:
Windows下CMake的下载与安装详解_cmake下载-CSDN博客
2.2VS2022安装,并确保安装python环境,matlab已经安装;
2.3nlopt下载;
nlopt是一个开源函数库,在github中下载,我下载的版本是2.7.1,下载链接为:stevengj/nlopt:非线性优化库,包装了许多用于全局和局部、约束或无约束优化的算法 (github.com)
3.具体编译过程
具体编译过程分为两步:cmake编译和vs导出动态库
3.1Cmake编译
(1)将nlopt文件夹移动到需要的位置,如果你下载的是压缩包,就将其解压再移动至目标位置;
解压后目录如图:
(2)在这个目录中建立一个文件夹,用来储存编译文件,我这里命名为“build”:
(3)打开安装好的cmake(gui),将目录中的CMakeLists拖入cmake(gui)界面,他会自己识别安装目录,这里修改编译目标文件夹方便区分,修改为buid文件夹,同时勾选advanced和grouped:
(4)选择文件夹后,点击CMake界面的Config按钮,第一次会选择编译器等,我的是VS 17 2022,继续点击开始配置:
配置过程中对话框会显示报警,只要没有error就可以继续,配置完后对话框会显示这两段输出:
(5)接着看ENTRY部分:
确保勾选了Ungroup Entries中的BUILD_SHARED_LIBS,这样能编译出共享库也就是动态链接库dll
(6)确保各个entry的路径正确并正确设置后(有的参考资料显示会有matlab路径不识别,我的是没有进行修改的),点击cmake界面的Genrate按钮,对话框会输出下段文字,显示正常进行:
这里cmake的任务就告一段落了,点击OPEN_PROJECT进入vs界面;
3.2VS2022编译动态库
打开VS后,显示如图:
(1)在右侧解决方案栏右键,选择“生成解决方案”就可以导出动态库了
注:配置不要选择debug,他会报错,应该是配置文件的问题:
应该选择release,再生成结局方案就会成功;
(2)在build文件夹里面会多出一个release文件夹,里面是编译成功的动态库:
将动态库和build中的nlopt.hpp和nlop\src\api中的nlopt.h复制到需要的文件夹进行测试使用,去网上找一点nlopt函数进行测量,运行成功则调用成功。
动态库的调用参考:C++动态链接库(DLL)的创建和调用(VS2019)_c++动态链接库怎么调试-CSDN博客
在编译过程中参考了: