首先构建一个空的项目pmvs,控制台应用程序,然后加pmvs2下的base下的三个文件夹拷贝到项目下,然后对应头文件及源文件添加到项目中。改写新建项目中的pmvs.cpp,将pmvs2中main里面的pmvs2.cc里面的部分内容添加到pmvs.cpp中,可以改写这个main函数的方法,不然执行的时候要传入参数。具体改写的内容下面附上大家参考。大家酌情更改。
下一步就是在.cc文件最上方添加预编译头#include "stdafx.h",这个东西就是跟名字意思一样,先编译,也是微软特有的,对于MFC之类,include的文件非常多,这样可以加快编译速度。
下面开始编译,这个时候会出现错误,这些错误一一解决。
错误 7 error C2065: “M_PI”: 未声明的标识符 f:\pmvs2\pmvs2\pmvs2\image\camera.cc 316 pmvs2
首先这个错误,这个错误的解决
项目添加一个gsl的库,这个是c语言中的科学计算的库,在项目工具选项中添加。
然后在项目中添加#include <gsl/gsl_math.h>
然后消除了上面的错误之后 再一次编译
下面会出现
好的,下面我们就重点看mylapack.cc这个文件。
float C[M * N];这个在linux直接定义一个数据就可以了。而在windows下要先实例化,或者初始化。改为float *C = new float[M * N];
改完了上面的错误之后再一次编译
好的,下面继续,我们就先看point.cc这个文件
string 类型也要初始化,按照是不是应该给string类型分配一个内存空间,采用了一个迂回的办法
string header;
char str[1024];
istr >> str;
header = string(str);
错误 1 fatal error C1083: 无法打开包括文件:“sys/time.h”: No such file or directory f:\pmvs2\pmvs2\pmvs2\pmvs\seed.cc 5 pmvs2
这个直接注释掉,这个是linux下的库,直接用#include <time.h>
struct timeval tv;
gettimeofday(&tv, NULL);
time_t curtime = tv.tv_sec;
换成clock_t curtime = clock();
再次编译
下面的错误就是这个线程库的问题了pthread这个线程库
这边主要是在linux下面,这个线程的初始化为数组,这边我们改成vector,例如:
//pthread_t threads[m_fm.m_CPU];
vector<pthread_t> threads(m_fm.m_CPU);
这样改好之后,下面编译基本上就没有错误了,主要就是linux下定义数组的时候不初始化,而windows下要初始化,主要这个区别
下面基本上就是链接错误了。
这个主要是这个pmvs程序引用了其他的库,这个时候在链接附加依赖项之后就可以编译通过,运行了。
上面可能不同机子有点问题,要把库添加到项目中。
https://github.com/TheFrenchLeaf/CMVS-PMVS/tree/master/program/thirdParty