在Windows系统上安装NLopt并配合VS使用

前言

最近在做的课题需要用到NLopt库来优化,然而配置环境困住了我至少四天。上网搜索了很多相关内容,根据这篇博客成功配合命令行使用,但是想要运行在vs上还是有困难。参考Gabriel Domingos的博客,我成功在VS2022上面配置了NLopt,现在记录一下整个过程。原博客指路

准备工具

  • Git Bash,如果需要下载,点击这里
  • CMake, 如果需要下载,点击这里
  • Visual Studio, 如果需要下载,点击这里 。作者使用的是2022版本。下载完成VS后,记得下载C++开发工具,具体配置C++环境,可参考这里

现在准备好了这些,开始安装吧!

开始安装

使用Git Bash下载NLopt

  • 在你想要安装的文件夹(我这里安装的文件夹位置是D:\OpenSource\nlopt)下打开Git Bash(在文件夹中右键可以看到Open Git Bash here),然后键入以下命令:
    git clone https://github.com/stevengj/nlopt
    
  • 之后你会在当前选择的文件夹下得到一个nlopt文件夹,其中包含的是GitHub上最新版本的NLopt。于是我当前的文件结构为D:\OpenSource\nlopt\nlopt.

使用CMake为Visual Studio构建工程

  • 打开CMake GUI(可以在安装的CMake文件夹中找到),在 “Where is source code” 中输入你的nlopt文件夹位置,在我的例子中是 D:\OpenSource\nlopt\nlopt

  • “Where to build the binaries” 选择文件夹放CMake构建的二进制文件。我在当前文件夹下创建了新的build文件夹,该文件夹的路径为 D:\OpenSource\nlopt\nlopt\build
    在这里插入图片描述

  • 点击 Generate 并确认你的Visual Studio 版本,我的选择是 Visual Studio 17 2022。点击 Finish
    在这里插入图片描述

  • 之后点击 Generate 然后等待,出现 Generating done 说明创建成功。
    在这里插入图片描述

  • 点击 Open Project,这会自动打开一个Visual Studio界面,如下图
    在这里插入图片描述

  1. 在这个界面中,在右侧,确保你有 ALL_BUILD
  2. 选择编译模式为 Release
  3. 选择你适合的x86或者x64格式
  4. 在上方菜单栏,点击 生成 中的 生成解决方案

以上步骤将为所选的配置和平台构建库。在完成 Release 模式后,你可以选择 Debug 再重复第四个步骤。

在Visual Studio中创建一个简单的例子

  • 打开 Visual Studio,创建新空白项目。
  • 新建一个 main.cpp 文件,复制以下代码:
    #include <iomanip>
    #include <iostream>
    #include <vector>
    
    #include <nlopt.hpp>
    
    typedef struct {
        double a, b;
    } my_constraint_data;
    
    double myvfunc(const std::vector<double>& x, std::vector<double>& grad, void* my_func_data)
    {
        if (!grad.empty()) {
            grad[0] = 0.0;
            grad[1] = 0.5 / sqrt(x[1]);
        }
        return sqrt(x[1]);
    }
    
    double myvconstraint(const std::vector<double>& x, std::vector<double>& grad, void* data)
    {
        my_constraint_data* d = reinterpret_cast<my_constraint_data*>(data);
        double a = d->a, b = d->b;
        if (!grad.empty()) {
            grad[0] = 3 * a * (a * x[0] + b) * (a * x[0] + b);
            grad[1] = -1.0;
        }
        return ((a * x[0] + b) * (a * x[0] + b) * (a * x[0] + b) - x[1]);
    }
    
    int main() {
        nlopt::opt opt(nlopt::LD_MMA, 2);
        std::vector<double> lb(2);
        lb[0] = -HUGE_VAL; lb[1] = 0;
        opt.set_lower_bounds(lb);
        opt.set_min_objective(myvfunc, NULL);
        my_constraint_data data[2] = { {2,0}, {-1,1} };
        opt.add_inequality_constraint(myvconstraint, &data[0], 1e-8);
        opt.add_inequality_constraint(myvconstraint, &data[1], 1e-8);
        opt.set_xtol_rel(1e-4);
        std::vector<double> x(2);
        x[0] = 1.234; x[1] = 5.678;
        double minf;
    
        try {
            nlopt::result result = opt.optimize(x, minf);
            std::cout << "found minimum at f(" << x[0] << "," << x[1] << ") = "
                << std::setprecision(10) << minf << std::endl;
        }
        catch (std::exception& e) {
            std::cout << "nlopt failed: " << e.what() << std::endl;
        }
    }		
    

这与 NLopt 教程中的代码几乎相同 - NLopt 文档的 C++ 选项卡中的示例,但从原始代码中更正了一些拼写错误。

当你粘贴并保存以上代码到main.cpp文件中时,可以看到Visual Studio提示这份代码有些问题,但是先别着急,后面让我们来配置Visual Studio项目解决这个情况。
在这里插入图片描述

配置Visual Studio项目

  • 在右侧 解决方案,点击鼠标右键,选择 属性,进入到 属性页
  • 将配置改为 所有配置, 平台改为 所有平台
    在这里插入图片描述
  • 在左侧的标签菜单上,选择 配置属性 ->调试 ->环境, 编辑上以下内容:
    PATH=%PATH%;D:\OpenSource\nlopt\nlopt\build\$(Configuration)
    
    这个地址是nlopt.dll所在的位置, 如果你的nlopt文件夹位置和我不一样,请找到相应的位置键入。
  • 选择 VC++目录 ->库目录, 编辑上以下内容:
    D:\OpenSource\nlopt\nlopt\build\$(Configuration)
    
    这个地址是nlopt.lib所在的位置
  • 选择 C/C++ -> 通用 -> 附加包含目录,编辑以下内容:
    D:\OpenSource\nlopt\nlopt\src\api
    D:\OpenSource\nlopt\nlopt\build
    
    第一行为nlopt.h文件的位置,第二行为nlopt.hpp文件的位置
  • 选择 链接器 -> 输入 -> 附加依赖项,编辑以下内容:
    nlopt.lib
    
  • 应用并保存以上所有配置。
  • 现在你可以看到,之前提示的错误全部解决了。
    在这里插入图片描述

配置成功

代码运行成功的结果为:

found minimum at f(0.333333,0.296296) = 0.5443310474

如果你跟我一样配置成功了,会有相同的结果。
在这里插入图片描述
—2024.08.24 更新 —

找不到nlopt.dll文件可能的解决办法

如果你是运行已有的项目,修改好配置后依旧显示找不到nlopt.dll文件,另外一种可以尝试的方法:直接找到你的nlopt.dll文件,将其复制到项目的debug或release文件夹下(一般和项目在同一个文件夹,或在同一个文件夹的x64文件夹内)随后即可解决。

### 如何在Qt中安装配置NLopt库 #### 准备工作 确保开发环境已经准备好,对于Windows平台而言,MinGW通常是首选工具链之一[^2]。这意味着如果通过Qt Creator进行项目构建,则应确认已选择了基于MinGW的套件。 #### 获取预编译二进制文件或源码包 可以从[NLopt官方网站](https://nlopt.readthedocs.io/en/latest/)下载适用于不同操作系统的预编译版本或是源代码压缩包。对于希望自定义编译选项的情况,建议获取后者按照官方文档指导完成本地化编译过程。 #### 编译静态/共享库(针对从源码开始) 当选择自行编译时,在Linux环境下可以直接利用`make`命令;而在Windows上则推荐借助CMake配合MSYS2/Mingw-w64来生成适合IDE使用的工程文件。特别注意的是,若采用MinGW作为目标架构的话,应当遵循特定指令序列以避免潜在冲突: ```bash mkdir build && cd build cmake .. -G "MinGW Makefiles" mingw32-make ``` 上述步骤完成后将会得到所需的`.a`(静态) 或 `.dll/.so`(动态)形式的目标文件[^1]。 #### 配置Qt项目文件(.pro) 为了让Qt应用程序能够识别到外部引入的第三方库,需编辑对应的.pro文件加入如下设置项: - **INCLUDEPATH**: 添加头文件所在目录路径; - **LIBS**: 指明链接器应该寻找哪些库以及它们的位置。 例如假设NLopt被放置于项目的third_party/nlopt子文件夹下: ```qmake # 增加include path以便访问nl opt 的头文件 INCLUDEPATH += $$PWD/third_party/nlopt/include \ $$PWD/build/src/api # 如果有额外API接口 # 连接静态库(-l前缀省略lib),或者指定绝对路径下的DLL/SO LIBS += -L$$PWD/third_party/nlopt/lib \ -lnlopt_cxx ``` 另外还需考虑运行期加载方式——即把必要的.dll放到exe同级目录里,或者是将其添加至系统的PATH变量列表内让程序启动时装入这些依赖关系。 #### 测试集成效果 创建简单的测试函数验证能否正常调用NLopt API功能。下面给出了一段最小化的例子用于展示基本求解流程: ```cpp #include <iostream> #include <nlopt.hpp> using namespace std; double myfunc(const vector<double> &x, vector<double> &grad, void *my_data){ if (!grad.empty()){ grad[0] = 0.0; grad[1] = 0.5 / sqrt(x[1]); } return sqrt(x[1]); } int main(){ nlopt::opt opt(nlopt::LN_COBYLA, 2); opt.set_min_objective(myfunc, NULL); opt.set_lower_bounds({-HUGE_VAL, 0}); opt.set_xtol_rel(1e-4); vector<double> x(2); x[0] = 1.234; x[1] = 5.678; double minf; try { nlopt::result result = opt.optimize(x, minf); cout << "found minimum at f(" << x[0]<< ","<<x[1]<< ") = " << minf << endl; } catch (exception &e) { cerr << "nlopt failed: " << e.what() << endl; } return 0; } ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ayu阿予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值