前提:windows下配置好VS2013
1、访问 http://www.cs.cornell.edu/~snavely/bundler/ 下载bundler-v0.4-source.zip并解压。
2、打开vs2013,打开bundler-v0.4-source目录下vc++目录中的Bundler.sln工程
3、依次编译bundler所需要的依赖库 5point、ann_1.1_char、cblas、getopt、imagelib、jpeg、matrix、sba-1.5、sfm-driver、f2c、clapack、cminpack,keyMatchFull、Bundler、Bundlr2PMVS、RadialUndistort,可能遇到的错误如下:
- 编译5point:
matrix.h中会出现错误 ,error C2054: 在“inline”之后应输入“(” ,参考博客,解决方法是在头文件添加如下语句:
#if defined(WIN32) && !defined(__cplusplus)
#define inline __inline
#endif
- 编译imagelib
error C2491: “erf”: 不允许 dllimport 函数 的定义,修改如下:
进入filter.c屏蔽该函数
- 编译f2c
会给出无法找到#include"sysdep1.h"文件的错误,修改如下:
进入f2c目录,将sysdep1.h0文件名修改为sysdep1.h、将signal1.h0文件名修改为signal1.h、
再次编译f2c库时,会提示无法找到#include"arith.h"文件的错误,同时在f2c目录下并没有名字为arith.h的文件
新建一个arith.h文件,内容如下:
#define IEEE_8087
#define Arith_Kind_ASL 1
#define Long int
#define Intcast (int)(long)
#define Double_Align
#define X64_bit_pointers
#define QNaN0 0x0
#define QNaN1 0xfff80000
- 编译keyMatchFull、Bundler
error C2491: “erf”: 不允许 dllimport 函数的定义
解决办法是将函数注释掉,不需要这个函数。
还会报错一个LNK问题。
解决办法是将imagelib那个项目编译一遍,会自动在LNK文件处添加依赖库,让问题得以解决
- 编译Bundlr2PMVS
error C3861: “mkdir”: 找不到标识符
在文件的开头添加#include<direct.h>,
同时将mkdir替换为_mkdir,如下所示:
//mkdir(output_path,0770);
_mkdir(output_path);
- 编译RadialUndistort
出现“无法识别的标识符index”。
//char *space = index(buf, ' ');
//if (space) *space = 0;
将其替换为:
std::string str(buf);
intspace_pos = str.find(' ');
str.at(space_pos) = 0;
files.push_back(str);
error C1083: 无法打开包括文件: “jpeglib.h”: No such file or directory
在RadialUndistort的属性页的c/c++ ->常规 -> 附加包含目录-> 增加项目lib包下的jpeg/src路径。(..\lib\jpeg\src)
属性---c/c++----常规-----附加包含目录添加..\lib\jpeg\src;..\lib\imagelib;..\include; ..\lib\matrix; ..\lib\sfm-driver
链接库----常规----------附加库目录增加文件路径\bundler-v0.4-source\vc++\Debug