win10安装ceres环境

    ceres是一个开源的c++库,在windows上安装有点复杂,它依赖其他三个库。Eigen,gflags,glog。好在这些依赖都可以通过源码安装。在windows上进行源码编译安装,需要对应的环境。这里的环境就是vs2017,cmake-3.14.0。

    vs2017自带了gcc,g++编译环境,而cmake正好需要g++编译环境。

    ceres源码都可以在官方下载到,这里使用的版本较早:

     gflags    2.2.1     需要提前编译

     glog       0.3.5     需要提前编译

     Eigen     3.4        只需要源码,不需要提前编译

     ceres-resolve  1.13.0   依赖其他三个库,最后编译

     这里给出csdn提供的下载:ceres安装包及相关依赖包

     编译安装

     1、编译gflags

     这里有个小提示,就是gflags源码需要修改一个地方,src/config.h.in,需要将下面代码删除。

     打开cmake-gui,根据界面提示,选择gflags源码位置和编译位置,点击"Configure"按钮,弹出编译选项,这里指定工程生成器为:Visual Studio 15 2017。生成器平台可选项:x64,最后点击"Finish"。第一次Configure会出现红色警告。    

    警告可以忽略,勾选"BUILD_SHARED_LIBS",这一步是生成动态链接库gflags.dll的。 

    再次点击Configure,警告消失:

    接着,可以进行生成了。点击"Generate"按钮,源码工程就生成好了。接着"Open Project"按钮可点击,直接点击"Open Project"按钮,在vs2017中打开项目。

打开vs2017之后,可以直接在Debug模式下生成:右键ALL_BUILD项目,直接生成。

如果不报错,那么就会生成gflags.dll等相关文件,还有头文件,lib库文件。 

     2、编译glog

    按照编译gflags的思路编译glog会很快,同样的,在cmake-gui界面中指定源码位置和编译位置,点击"Configure"按钮,第一次也会出现警告。这里因为glog需要依赖gflags库,所以需要指定gflags编译后的位置。     

     指定gflags_DIR位置之后,再次"Configure" ,警告消失。

    可以点击“Generate”按钮,生成工程代码。最后利用vs2017打开glog工程,右键ALL_BUILD项目,生成。 

     3、编译ceres

     按照上面的思路,选择ceres源码和编译位置,点击"Configure"按钮,不仅会有红色警告提示,还有报错。

    这时候,勾选EIGENSPARSE选项,并设置EIGEN_INCLUDE_DIR目录,指定Eigen源码位置。再次Configure,这时候,会出现没有指定gflags编译目录参数gflags_DIR,同样的,设置gflags-build目录即可。如果CMAKE_BUILD_TYPE显示红色警告,就添加一个Debug参数。最后的结果如下所示:

    最后,没有警告,可以"Generate"生成项目,然后"Open Project",利用vs2017打开工程,直接在Debug模式下,右键ALL_BUILD工程,生成。这个过程很慢,因为最后会生成10G的文件,其中包括可执行程序示例程序,在bin\Debug目录下有helloworld.exe,我们在cmd命令行下可以直接运行,他就是ceres入门程序。(我经过了几次安装,有一次没有把gflags.dll加入windows/system32目录下,也可以运行成功示例helloworld,后来几次安装都提示缺少gflags.dll文件,将gflags编译产生的gflags-build\bin\Debug\gflags.dll加入C:\Windows\System32目录下就好了)

     以上没有报错,整个编译结束。

============================================================

     使用ceres

     这里主要针对开发环境vs2017,需要头文件,依赖库,动态链接库。

     一、在vs2017中新建项目

    如果运行示例程序提示缺失gflags.dll动态链接库,就把将gflags编译产生的gflags-build\bin\Debug\gflags.dll加入C:\Windows\System32目录下就好了。

     二、准备头文件和库文件

     在项目路径下新建include文件夹和lib文件夹

     这个版本编译结束,在使用头文件的时候,有几个需要注意的地方,Eigen没有include文件,直接将Eigen源码目录下的Eigen目录全部拷贝即可。

     glog编译后的头文件,没有include目录,直接在编译目录下一个叫glog的文件夹,缺失一个log_serverity.h文件,但是在源码src/glog目录下可以找到。

     ceres头文件在源码目录中,但是源码目录中还有一个config目录,里面包含了一个在include目录中没有的头文件ceres/internal/config.h,拷贝头文件的时候,需要合并拷贝。

 需要的库文件:ceres编译后的lib\Debug目录下的ceres-debug.lib,gflags编译后lib\Debug目录下的两个文件:gflags.lib和gflags_nothreads.lib,glog编译后lib\Debug目录下的一个文件glog.lib。

    三、项目设置

右键项目属性,对项目进行如下设置:

1、vc++目录,将项目下的包含目录和库目录依次指定为include目录和lib目录,如下图所示:

     2、c/c++常规,这里需要设置附加包含目录,将include目录指定即可。

     3、c/c++->链接器->输入,这里需要手动将lib目录下的lib文件依次添加到附加依赖项中。

    准备示例源码:

#include <iostream>
#include "ceres/ceres.h"
#include "glog/logging.h"


using ceres::AutoDiffCostFunction;
using ceres::CostFunction;
using ceres::Problem;
using ceres::Solver;

struct CostFunctor {
	template<typename T>
	bool operator()(const T* const x, T* residual) const {
		residual[0] = T(10.0) - x[0];
		return true;
	}
};
int main(int argc,char** argv)
{
	google::InitGoogleLogging(argv[0]);
	double initial_x = 5.0;
	double x = initial_x;

	Problem problem;

	CostFunction* cost_function = new AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor);

	problem.AddResidualBlock(cost_function, NULL, &x);

	Solver::Options options;
	options.linear_solver_type = ceres::DENSE_QR;
	options.minimizer_progress_to_stdout = true;
	Solver::Summary summary;
	Solve(options, &problem, &summary);
	std::cout << summary.BriefReport() << "\n";
	std::cout << "x : " << initial_x << " -> " << x << "\n";
	return 0;
}

     开始执行,报错:

     按照提示,修改ceres/jet.h头文件,将j0,j1,jn分别改为标准c++兼容的_j0,_j1,_jn,顺利编译通过。 

 这时候,运行程序,可能出现前面所说的缺少gflags.dll动态链接库。

     解决办法前面提到过,将gflags-build\bin\Debug\gflags.dll文件加入C:\Windows\System32即可。

正确运行程序控制台输出:

     以上过程为win10编译安装ceres库以及通过vs2017编辑器运行代码介绍,中间很多小细节,希望对再次安装的人有帮助。 编译生成的时候,vs2017下全部使用的是Debug模式,虽然有的文章提到要使用Release模式。

      在cmake-gui中,编译顺序,依次是gflags,glog,ceres,因为他们互相依赖,configure出错,基本就是没找到依赖项编译后的位置。反复configure警告可以全部消失,最后generate,直到在vs2017中生成成功。

猜你喜欢

转载自blog.csdn.net/feinifi/article/details/120645835