win10+使用cmake编译最新的ceres-solver库

news2025/2/28 12:50:51

参考文献

点击这里访问
感谢大佬!

说明

我这个只编译了release版本,如果还需要debug版本,cmake编译vs编译都需要另外设置一些东西,我没有弄。

1. 需要使用的库

  • ceres-solver-2.1.0
  • eigen-3.4.0
  • gflags-2.2.2
  • glog-0.4.0

大家需要自行到对应的github上去下载。

2. 需要的工具

  • visual studio 2022 community
  • cmake 3.26.3

大家需要自行下载安装。

3. 准备工作

3.1 建一个文件夹用来放所有解压后的源代码

比如这样:
在这里插入图片描述

3.2 建一个文件夹用来放所有的 b u i l d build build文件

比如all_build,里面建4个文件夹用来放4个库的build文件
在这里插入图片描述
在这里插入图片描述

3.3 建一个文件夹用来放所有的 i n s t a l l install install文件

跟建all_build类似,建一个all_install

在这里插入图片描述
在这里插入图片描述

4. 打开 c m a k e cmake cmake开始编译。

4.1 e i g e n eigen eigen

4.1.1 c m a k e cmake cmake编译

在这里插入图片描述
点击config → \rightarrow 选择对应的平台 → \rightarrow finish。会一片红色。

  1. CMAKE_INSTALL_PREFIX改为之前建的all_install文件夹对应的eigen子文件夹
    在这里插入图片描述

config,这个时候应该没有报错了, → \rightarrow generate → \rightarrow open project,打开vs工程。

4.1.2 v s vs vs编译

在这里插入图片描述

点击 生成 → \rightarrow 批生成

在这里插入图片描述
在这里插入图片描述
勾选 ALL_BUILDrelease版本和INSTALLrelease版本,点击 生成,没有报错,说明就对了。

结果:会在eigeninstall文件夹下生成一些文件:
在这里插入图片描述

4.2 g f l a g s gflags gflags

4.2.1 c m a k e cmake cmake编译

在这里插入图片描述
点击config → \rightarrow 选择对应的平台 → \rightarrow finish。会一片红色。

  1. 勾选BUILD_SHARED_LIBS
  2. CMAKE_INSTALL_PREFIX改为gflags对应的install文件夹。
    在这里插入图片描述
    config,这个时候应该没有报错了, → \rightarrow generate → \rightarrow open project,打开vs工程。

4.2.2 v s vs vs编译

步骤同 4.1.2 4.1.2 4.1.2一样。
没有报错的话,结果会在gflags对应的install文件夹下生成一些文件:
在这里插入图片描述

4.3 g l o g glog glog

4.3.1 c m a k e cmake cmake编译

在这里插入图片描述
点击config → \rightarrow 选择对应的平台 → \rightarrow finish。会一片红色。

  1. 勾选BUILD_SHARED_LIBS
  2. CMAKE_INSTALL_PREFIX改为glog对应的install路径
  3. 设置gflags_DIRgflags对应的build路径
    在这里插入图片描述
    config,这个时候应该没有报错了, → \rightarrow generate → \rightarrow open project,打开vs工程。

4.3.2 v s vs vs编译

步骤同 4.1.2 4.1.2 4.1.2一样。
没有报错的话,结果会在glog对应的install文件夹下生成一些文件:
在这里插入图片描述

4.4 c e r e s ceres ceres

4.4.1 c m a k e cmake cmake编译

在这里插入图片描述

点击config → \rightarrow 选择对应的平台 → \rightarrow finish。会一片红色。

  1. 勾选BUILD_SHARED_LIBS
  2. CMAKE_INSTALL_PREFIX改为ceres对应的install路径
  3. Eigen3_DIR设置为eigenbuild路径
  4. gflags_DIR设置为gflagsbuild路径
  5. CMAKE_BUILD_TYPE设置为Release
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    点击config,这个时候应该没有报错了, → \rightarrow generate → \rightarrow open project,打开vs工程。

4.4.2 v s vs vs编译

步骤同 4.1.2 4.1.2 4.1.2一样。
没有报错的话,结果会在ceres对应的install文件夹下生成一些文件:
在这里插入图片描述

5. 动态库整理

all_install文件夹下新建一个dlls文件夹,然后将all_install文件夹下ceres/bingflags/bin,以及glog/bin里面的.dll文件全部复制到dlls文件夹中
在这里插入图片描述
在这里插入图片描述

6. 测试

6.1 代码

让我们写一段代码来进行测试吧。新建一个项目,复制粘贴下面的代码。
这是求解 x x x 的值使得 1 2 ( 10 − x ) 2 \frac{1}{2}(10−x)^2 21(10x)2 最小

#include<iostream>
#include<ceres/ceres.h>
using namespace std;

//第一部分:构建代价函数
struct CostFunctor {
    //模板函数,泛化函数类型
    template <typename T>
    //重载符号(),仿函数;传入待优化变量列表和承接残差的变量列表
    bool operator()(const T* const x, T* residual) const 
    {
        //残差计算步骤
        residual[0] = T(0.5) * (T(10.0) - x[0]) * (T(10.0) - x[0]);//1/2(10−x)^2
        return true;
    }
};

//主函数
int main(int argc, char** argv)
{
    // 寻优参数x的初始值,为5
    double initial_x = 5.0;
    double x = initial_x;

    // 第二部分:构建寻优问题
    //实例化Problem
    ceres::Problem problem;
    //代价函数赋值
    //使用自动求导,将之前的代价函数结构体传入,第一个1是输出维度,即残差的维度,第二个1是输入维度,即待寻优参数x的维度。
//    ceres::CostFunction* cost_function = new AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor);
    //添加误差项,1、上一步实例化后的代价函数2、核函数3、待优化变量
    problem.AddResidualBlock(new ceres::AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor), nullptr, &x);

    //第三部分: 配置并运行求解器
    ceres::Solver::Options options;
    //配置增量方程的解法,此处为QR求解
    options.linear_solver_type = ceres::DENSE_QR;
    //是否输出到cout
    options.minimizer_progress_to_stdout = true;
    //优化信息
    ceres::Solver::Summary summary;
    //求解:1、求解器2、实例化problem 3、优化器
    Solve(options, &problem, &summary);
    //输出优化的简要信息,迭代次数和每次的cost
    std::cout << summary.BriefReport() << "\n";
    //最终结果
    std::cout << "初始值x : " << initial_x << " 迭代到-> " << x << "\n";
    return 0;
}

显然会报很多错,因为还没有设置环境。

6.2 将模式改为 r e l e a s e release release

因为编译的是release模式
在这里插入图片描述

6.3 添加属性表,以后都可以用

在这里插入图片描述

属性管理器 → \rightarrow release → \rightarrow 右键,添加新项目属性表,改名为ceres.props,点击添加,双击这个属性表,打开进行设置。

在这里插入图片描述

6.4 设置属性表

6.4.1 c / c + + → c/c++\rightarrow c/c++常规 → \rightarrow 附加包含目录

all_install文件夹下的ceres/includegflags/includeglog/include全部添加进去。对应eigen,添加它的源代码目录。也就是一开始放4个源码的那里,找到eigen
最后点击应用

在这里插入图片描述

6.4.2 链接器 → \rightarrow 常规 → \rightarrow 附加库目录

all_install文件夹下的ceres/libgflags/libglog/lib全部添加进去。

在这里插入图片描述

6.4.3 链接器 → \rightarrow 输入 → \rightarrow 附加依赖项

all_install文件夹下的ceres/libgflags/libglog/lib下的.lib文件全部添加进去。

在这里插入图片描述

6.4.4 生成事件 → \rightarrow 生成后事件 → \rightarrow 命令行

复制以下命令行xcopy /y /d /s /e "D:\libs\ceres\all_install\dlls" "$(OutDir)",但是将路径替换为你自己的dlls的路径。就是动态库整理那一步中创建的路径。

在这里插入图片描述
确定,保存属性表。

6.5 编译与运行

  1. 可能会遇到一些visual studio的安全性错误,这个在网上搜一下就可以解决。只要不是报库的错误就行。
  2. 结果:
    我们预期是10,结果显然是对的。
    在这里插入图片描述

7. 结论

大功告成!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/520286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Neovim-配置教程

环境&#xff1a;Ubuntu 20.04 宿主机&#xff1a;windows &#xff08;windows terminal&#xff09;WSL2 NVIM&#xff1a;v0.10.0-dev 配置Neovim 需要保证流畅的github环境&#xff08;以便于快速拉取插件&#xff09;&#xff0c;可以使用代理或是配置Github SSH key 本文…

【OpenCV-Python】——Haar人脸检测深度学习人脸检测EigenFaces/FisherFaces/LBPH人脸识别

目录 前言&#xff1a; 1、人脸检测 1.1 基于Haar的人脸检测 1.2 基于深度学习的人脸检测 2、人脸识别 2.1 EigenFaces人脸识别 2.2 FisherFaces人脸识别 2.3 LBPH人脸识别 总结&#xff1a; 前言&#xff1a; 人脸检测是人脸定位的过程&#xff1b;人脸识别是在人脸…

macOS 下载汇总(系统、应用和教程) 2023 持续更新中

macOS Ventura 13, macOS Monterey 12, macOS Big Sur 11, macOS Catalina 10.15, macOS Mojave 10.14, macOS High Sierra 10.13, macOS Sierra 10.12 请访问原文链接&#xff1a;https://sysin.org/blog/macOS/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。…

VMware Aria Suite 8.12 - 云管理解决方案 (下载索引)

VMware Aria Suite 8.12 - 云管理解决方案 (下载索引) 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-aria-suite/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 云管理套包 VMware Aria Suite&#xff08;以前…

网络基础知识(2)——简单说说IP地址

Internet 依靠 TCP/IP 协议&#xff0c;在全球范围内实现不同硬件结构、不同操作系统、不同网络系统的主机之间的互联。在 Internet 上&#xff0c;每一个节点都依靠唯一的 IP 地址相互区分和相互联系&#xff0c;IP 地址用于标识互联网中的每台主机的身份&#xff0c;设计人员…

Windows 20个经典cmd命令,值得收藏

本文重点介绍Windows系统常用工具和服务的快捷启动命令。相比鼠标多次点击打开窗口&#xff0c;输入命令回车一键打开更为快捷高效。喜欢请点赞收藏&#xff0c;关注我获取最新原创分享~ 一、Windows启动命令使用方式 快捷键 【徽标R】打开命令窗口 输入命令&#xff0c;点击【…

ARM 栈帧(一)

ARM 栈帧 本系列均以 corter-A7(armv7-a) 为例 在 ARM 中&#xff0c;通常为满减栈&#xff08;Full Descending FD&#xff09;, 也就是说&#xff0c;堆栈指针指向堆栈内存中最后一个填充的位置&#xff0c;并且随着每个新数据项被压入堆栈而递减。 栈的本质 要理解栈的本…

基于NXP+FPGA的大容量固态存储板实现方案

1 概述 近年来 &#xff0c;大容量数据存储设备受到软硬件等发展的限制主 要还是采用机械硬盘叠加组合而用。机械硬盘以磁盘片作为载 体 &#xff0c;采用机械马达 &#xff0c;存在抗振性能低、低温性能差、噪声大等缺点。 固态硬盘是以半导体作为存储介质及控制载体 &…

使用马哈鱼SQLFLow 1 分钟获取复杂 SQL 语句的血缘关系

数据血缘关系在企业的数据治理中是非常重要的一个环节&#xff0c;关于数据血缘在企业数据治理中的重要作用&#xff0c;可以参考这篇文章。SQL 语言在数据处理中被广泛使用&#xff0c;SQL 语句中包含了丰富的数据血缘关系&#xff0c;关于什么是 SQL 中的数据血缘&#xff0c…

死锁与活锁

1 死锁概述 死锁主要是由于资源使用不当引发的。OS中存在很多不同类型的软硬件资源&#xff0c;而可以引发死锁的资源 主要是需要互斥访问的、不可被抢占的资源&#xff0c;即临界资源。下面先来简单了解下资源的分类。 资源分类 按照资源是否可重复使用划分&#xff0c;可以分…

Spring ( 三 ) SpringIoC

3.SpringIoC Spring 核心 是 通过IoC 降低 项目中的类之间的耦合 IoC Inversion of Control 控制反转&#xff1a; 应用本身不负责依赖对象的创建及维护&#xff0c;依赖对象的创建及维护是由外部容器负责的。 ​ 这样控制权就由应用转移到了外部容器&#xff0c;控制权的转移…

【Linux从入门到精通】一文带你理解进程概念

我们通过对上篇文章冯诺依曼体系结构对硬件进行讲解后&#xff0c; 本篇文章会对进程进行深入讲解。同时会讲解PCB&#xff08;进程控制块&#xff09;。希望本篇文章内容会对你有所帮助。 文章目录 一、再次理解操作系统 1、1 操作系统的作用 1、2 操作系统的管理 二、进程基本…

基于Kubernetes集群构建大中型企业CICD应用平台(5)--Integrate工具

5.1、jenkins介绍 持续集成、持续部署的工具很多&#xff0c;其中Jenkins是一个开源的持续集成平台。 Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务&#xff0c;并且还涉及到了构建项目等任务。 Jenkins需要大量的插件保证工作&#xff0c;安装成本较高&am…

Java Web开发:Spring Boot和Spring Cloud的应用和实践

一、介绍 Java Web开发是当今互联网时代中的一项重要技术&#xff0c;随着互联网的发展和应用场景的不断扩大&#xff0c;Java Web开发技术也得到了广泛的应用。而Spring Boot和Spring Cloud作为Java Web开发中最常用的技术之一&#xff0c;已经成为了很多开发者必备的技能。本…

使用Vue3和Typescript实现可复用的路由标签页和面包屑导航组件

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、为什么需要可复用的路由标签页和面包屑导航组件1.1 前端应用导航的问题1.2 解决问题的方法二、Vue3和Typescript基础知识回…

shell脚本中数组的运用以及排序算法

shell脚本中数组的运用 一、数组的介绍1、概念2、定义方法3、数组包括的数据类型 二、关于数组的操作1、获取数组长度2、获取数组各个元素的下标3、获取数组列表或单个元素4、对数组切片输出5、对数组里的元素替换6、删除单个元素或数组7、数组追加元素8、向函数传入数组的值 三…

Learning C++ No.20 【红黑树实战】

引言&#xff1a; 北京时间&#xff1a;2023/5/12/20:30&#xff0c;今天周五&#xff0c;周五不摆烂从我做起&#xff0c;虽然刚睡醒&#xff0c;但是今天如果论学习时长&#xff0c;那可能是许久以来最长的一天&#xff0c;从早上6:40晨跑回来坐在凳子上&#xff0c;一坐久坐…

在 I/O 看未来 | 开发者集合!官方学习资源已更新,即 课 解锁新技能!

看完 Google I/O 2023 的精彩内容 你是否已跃跃欲试&#xff0c;准备充电学习&#xff1f; 马上跟随 Google 开发者在线课程 刷新知识储备和开发技能 将技术热爱落地为实践应用&#xff01; "解码 Google I/O 洞见科技未来" 征文活动 也向身为技术爱好者的你发出召唤…

【Wi-Fi】802.11/802.11b/802.11g/802.11n/802.11a/802.11ac/802.11ax/802.11be

WiFi发展历史 IEEE 802.11 Protocol Release Date Frequency Band Bandwidth Max Throughput 802.11-1997 1997 2.4GHz 22MHz 2Mbps 802.11b 1999 2.4GHz 22MHz 11Mbps 802.11a 1999 5GHz 20MHz 54Mbps 802.11g 2003 2.4GHz 20MHz 54Mbps 802.11n (W…

Kubernetes❀实战入门

Kubernetes❀实战入门 4. 实战入门4.1 Namespace4.1.1 **查看**4.1.2 **创建**4.1.3 **删除**4.1.4 **配置方式** 4.2 Pod4.2.1 创建并运行4.2.2 查看pod信息4.2.3 访问Pod4.2.4 删除指定Pod4.2.5 配置操作 4.3 Label4.3.1 命令方式4.3.2 配置方式 4.4 Deployment4.4.1待操作。…