# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +

一、前言

PCL的依赖均安装到:E:\PCL_dependencies 目录下。

二、boost 编译

2.1、下载源码

采用源码编译,从这里下载boost1.62.0.zip源码。

2.2、生成编译工具

解压源码,在目录下有boost库自带的bootstrap.bat脚本来生成一个构建工具b2.exe。打开VS2015 x64 本机工具命令提示符,切换到解压的boost1.62.0目录,执行bootstrap.bat
代码如下:

F:
cd F:\compile\boost_1_62_0
bootstrap.bat

如下图所示:

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第1张图片
执行成功后会在目录下生成 b2.exebjam.exe文件。如下图示:
bootstrap.bat_sucess

TIPS:
(1)、这里可能会出错,错误如下:

Building Boost.Build engine

Failed to build Boost.Build engine.
Please consult bootstrap.log for further diagnostics.

You can try to obtain a prebuilt binary from

   http://sf.net/project/showfiles.php?group_id=7586&package_id=72941

Also, you can file an issue at http://svn.boost.org
Please attach bootstrap.log in that case.

打开目录下的bootstrap.log文件,出现类似下面这种错误:

bootstrap fatal error C1034: ctype.h: 不包括路径集

解决方案
在系统的环境变量path中, 添加C:\Windows\system32;
重启电脑。OK。

2.3 编译源码

使用b2.exe进行源码编译,各参数的含义1,代码如下:

// 安装目录C:\Boost,编译类型:complete(debug和release),编译时使用build_tmp文件夹,编译工具:vc14(VS2015的编译器的内部名字是vc14),编译目标:x64, -j4:四核同时编译(I5-5400 CPU,不带-j4则使用单核编译)
//#编译
b2.exe --prefix=E:\PCL_dependencies --build-type=complete --build-dir=build_tmp toolset=msvc-14.0 address-model=64 stage -j4

编译过程耗时较长,在I5-6400下大概20分钟。

编译结果如下:

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第2张图片

注意到里面有failed、skiped的targets,但其实编译成功,原因是因为boost还可以生成其他软件使用的第三方库,如Python等,如不使用这些,则无影响[^2],链接。

2.4 安装源码

//#安装
b2.exe --prefix=E:\PCL_dependencies --build-type=complete --build-dir=build_tmp toolset=msvc-14.0 address-model=64 install

安装完成后,也会有failed、skiped的targets,也无影响。
C:\Boost目录下,生成了boost的include文件和lib文件,在lib文件夹下有.dll 和 .lib文件,其中名字中带 -gd 的是动态链接库的debug版本的lib,名字中不带-gd的是动态链接库的release版本。带-sgd是静态链接库的debug版本lib,带-s的是静态链接库的release版本lib。

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第3张图片

2.5 测试

打开VS2015,新建一个控制台程序,新建一个.cpp文档,写入一下代码(来源):

// main.cpp
#include      
#include      
using namespace std;
int main()
{
    using boost::lexical_cast;
    int a = lexical_cast<int>("123");
    double b = lexical_cast<double>("123.0123456789");
    string s0 = lexical_cast<string>(a);
    string s1 = lexical_cast<string>(b);
    cout << "number: " << a << "  " << b << endl;
    cout << "string: " << s0 << "  " << s1 << endl;
    int c = 0;
    try {
        c = lexical_cast<int>("abcd");
    }
    catch (boost::bad_lexical_cast& e) {
        cout << e.what() << endl;
    }
    system("pause");
    return 0;
}

切换到debug X64平台,打开【视图】→【其他窗口】→【属性管理器】,右键【Debug | x64】选择【新建属性表】,新建一个名为:boost_1.62_0_VS2015_DEBUG_X64.props的属性表。

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第4张图片

打开刚才新建的属性表,在【VC++目录】中填入boost的include文件夹和lib文件夹:
【包含目录】:E:\PCL_dependencies\Boost\include\boost-1_62;
【库目录】:E:\PCL_dependencies\Boost\lib;

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第5张图片

在【链接器】→【输入】中填入boost 的debug版本*.lib文件名:
# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第6张图片

完整.lib文件名如下(使用动态链接库的debug版本lib,其他版本的lib名字参看前一小节。批量获取特定后缀文件名工具):

boost_atomic-vc140-mt-gd-1_62.lib
boost_chrono-vc140-mt-gd-1_62.lib
boost_container-vc140-mt-gd-1_62.lib
boost_context-vc140-mt-gd-1_62.lib
boost_coroutine-vc140-mt-gd-1_62.lib
boost_date_time-vc140-mt-gd-1_62.lib
boost_fiber-vc140-mt-gd-1_62.lib
boost_filesystem-vc140-mt-gd-1_62.lib
boost_graph-vc140-mt-gd-1_62.lib
boost_iostreams-vc140-mt-gd-1_62.lib
boost_locale-vc140-mt-gd-1_62.lib
boost_log-vc140-mt-gd-1_62.lib
boost_log_setup-vc140-mt-gd-1_62.lib
boost_math_c99-vc140-mt-gd-1_62.lib
boost_math_c99f-vc140-mt-gd-1_62.lib
boost_math_c99l-vc140-mt-gd-1_62.lib
boost_math_tr1-vc140-mt-gd-1_62.lib
boost_math_tr1f-vc140-mt-gd-1_62.lib
boost_math_tr1l-vc140-mt-gd-1_62.lib
boost_prg_exec_monitor-vc140-mt-gd-1_62.lib
boost_program_options-vc140-mt-gd-1_62.lib
boost_random-vc140-mt-gd-1_62.lib
boost_regex-vc140-mt-gd-1_62.lib
boost_serialization-vc140-mt-gd-1_62.lib
boost_signals-vc140-mt-gd-1_62.lib
boost_system-vc140-mt-gd-1_62.lib
boost_thread-vc140-mt-gd-1_62.lib
boost_timer-vc140-mt-gd-1_62.lib
boost_type_erasure-vc140-mt-gd-1_62.lib
boost_unit_test_framework-vc140-mt-gd-1_62.lib
boost_wave-vc140-mt-gd-1_62.lib
boost_wserialization-vc140-mt-gd-1_62.lib
libboost_atomic-vc140-mt-gd-1_62.lib
libboost_chrono-vc140-mt-gd-1_62.lib
libboost_container-vc140-mt-gd-1_62.lib
libboost_context-vc140-mt-gd-1_62.lib
libboost_coroutine-vc140-mt-gd-1_62.lib
libboost_date_time-vc140-mt-gd-1_62.lib
libboost_exception-vc140-mt-gd-1_62.lib
libboost_fiber-vc140-mt-gd-1_62.lib
libboost_filesystem-vc140-mt-gd-1_62.lib
libboost_graph-vc140-mt-gd-1_62.lib
libboost_iostreams-vc140-mt-gd-1_62.lib
libboost_locale-vc140-mt-gd-1_62.lib
libboost_log-vc140-mt-gd-1_62.lib
libboost_log_setup-vc140-mt-gd-1_62.lib
libboost_math_c99-vc140-mt-gd-1_62.lib
libboost_math_c99f-vc140-mt-gd-1_62.lib
libboost_math_c99l-vc140-mt-gd-1_62.lib
libboost_math_tr1-vc140-mt-gd-1_62.lib
libboost_math_tr1f-vc140-mt-gd-1_62.lib
libboost_math_tr1l-vc140-mt-gd-1_62.lib
libboost_prg_exec_monitor-vc140-mt-gd-1_62.lib
libboost_program_options-vc140-mt-gd-1_62.lib
libboost_random-vc140-mt-gd-1_62.lib
libboost_regex-vc140-mt-gd-1_62.lib
libboost_serialization-vc140-mt-gd-1_62.lib
libboost_signals-vc140-mt-gd-1_62.lib
libboost_system-vc140-mt-gd-1_62.lib
libboost_test_exec_monitor-vc140-mt-gd-1_62.lib
libboost_thread-vc140-mt-gd-1_62.lib
libboost_timer-vc140-mt-gd-1_62.lib
libboost_type_erasure-vc140-mt-gd-1_62.lib
libboost_unit_test_framework-vc140-mt-gd-1_62.lib
libboost_wave-vc140-mt-gd-1_62.lib
libboost_wserialization-vc140-mt-gd-1_62.lib

编译运行,结果如下表示成功:

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第7张图片

值得一提的是,刚才新建的属性表可以保存起来,以后如果在项目中用到boost,则可以在【属性管理器】中添加刚才新建的属性表,省去每次配置属性表的麻烦。

三、Eigen 编译

Eigen3.3.1的编译基本按照这里的步骤。

3.1 下载源码

从Eigen官网下载Eigen3.3.1源码。

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第8张图片,解压。

3.2 构建工程

使用cmake构建Eigen的VS2015编译工程。打开cmake-gui.exe,设置源码路径(就是包含”CMakeLists.txt”的路径)和构建路径,本文设置如下:

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第9张图片

勾选CMake界面上的 【Grouped】和 【Advanced】,Grouped是对配置分组,Advanced是显示高级配置。

ga

点击【Configure】,选择VS2015 64位编译器。

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第10张图片

等待CMake把配置生成完毕后,就需要对CMake自动生成的配置进行修改.所有红色显示的配置,都是需要用户确认的配置或者有问题的配置,在默认配置上进行如下修改:
修改CMAKE_INSTALL_PREFIX值为:E:\PCL_dependencies\Eigen3.3.1。这个目录可以自行指定,当Eigen编译完成后,安装时,会将Eigen安装到指定的目录,强烈建议修改此目录.

这里写图片描述

再次点击【Configure】后点击【generate】,结果如下图所示。

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第11张图片

3.3 编译源码

用VS2015打开F:\compile\eigen-eigen-f562a193118d\build目录下的Eigen3.sln解决方案。

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第12张图片

确保ALL_BUILD为启动项目(如果没出问题,它应该就是启动项目)。选择ALL_BUILD项目,点击生成。

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第13张图片

然后选择INSTALL安装。安装完成,就可以在之前设置的prefix目录下.在E:\PCL_dependencies将看到安装之后的Eigen。

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第14张图片

注:Eigen不会生成二进制文件,只生成头文件,所以无所谓debug或release配置.

3.4 测试

用VS2015创建一个控制台运用程序,写入以下代码(来源):

#include   
#include   
using namespace Eigen;
int main(int argc, char* argv[])
{
    MatrixXd m(2, 2);
    m(0, 0) = 3;
    m(1, 0) = 2.5;
    m(0, 1) = -1;
    m(1, 1) = m(1, 0) + m(0, 1);
    std::cout << "Here is the matrix m:\n" << m << std::endl;
    VectorXd v(2);
    v(0) = 4;
    v(1) = v(0) - 1;
    std::cout << "Here is the vector v:\n" << v << std::endl;

    system("pause");
    return 0;
}

与配置boost一样,新建一个新的属性表,命名为:Eigen_VS2015_x64_DEBUG_RELEASE.props。打开刚才新建的属性表,在【VC++目录】中填入Eigen3的include文件夹路径:
在【包含目录】填入:E:\PCL_dependencies\Eigen3.3.1\include\eigen3

注:由于不用生成二进制文件,所以编译时使用debug和release配置都一样.

成功运行结果如下:

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第15张图片

四、flann 编译

4.1 源码编译

从flann官网或者flann的github主页下载最新版源码,推荐从GitHub下载,不然会出现下面第6点错误,GitHub上已修复该bug。
flann的编译与Eigen编译过程基本一样。需要注意到是第4点和第6点
步骤如下:

1.cmake-gui.exe,设置源码路径和构建路径,本文设置如下:

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第16张图片

2.点击【Configure】,选择VS2015 64位编译器。

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第17张图片

3.在CMAKE节点,找到CMAKE_INSTALL_PREFIX节点,设置为E:\PCL_dependencies\flann-1.8.4。该值为编译后,flann的安装目录。

4.点击Add Entry按钮,设置Name为CMAKE_DEBUG_POSTFIX,Type为STRING,Value为-gd,设置完后,点击确定。按Configure按钮,等待配置完成。设置该项保证debug版本的lib,dll和release版本lib,dll名字不同,以防止后面安装时,两者覆盖(debug版本的lib和dll文件名字后面会加-gd)。

5.然后再点按【Configure】按钮,完成后,点击【Generate】按钮,生成项目VS2015解决方案。

6.在解决方案管理器里,找到ALL_BUILD,右键,点击生成。等待VS编译完成。完成后,找到INSTALL,点击鼠标右键,点击生成。若代码是从flann官网下载的压缩包,而不是从flann的GitHub主页下载的,编译完成后,在错误列表会提示serialization.h有错误:

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第18张图片

双击错误,即可打开该头文件,然后在第92行,后面添加:

#ifdef _MSC_VER
BASIC_TYPE_SERIALIZER( unsigned __int64 );
#endif

然后再点击生成。完成后,找到INSTALL,点击鼠标右键,点击生成。
7. 切换解决方案配置为release,在解决方案管理器里,找到ALL_BUILD,右键,点击生成。等待VS编译完成。完成后,找到INSTALL,点击鼠标右键,点击生成。
8.上述步骤完成后,在E:\PCL_dependencies\flann-1.8.4路径下,即为编译好的文件。

4.2 测试

1、下载测试数据文件:

http://people.cs.ubc.ca/~mariusm/uploads/FLANN/datasets/dataset.dat
http://people.cs.ubc.ca/~mariusm/uploads/FLANN/datasets/testset.dat

2、用VS2015创建一个控制台运用程序,将下载的dataset.dattestset.dat复制得到项目目录下,新建main.cpp文件,写入以下代码:

///main.cpp
#include 
#include 
#include 

float* read_points(const char* filename, int rows, int cols)
{
    float* data;
    float *p;
    FILE* fin;
    int i, j;

    fin = fopen(filename, "r");
    if (!fin) {
        printf("Cannot open input file.\n");
        exit(1);
    }

    data = (float*)malloc(rows*cols * sizeof(float));
    if (!data) {
        printf("Cannot allocate memory.\n");
        exit(1);
    }
    p = data;

    for (i = 0; ifor (j = 0; jfscanf(fin, "%g ", p);
            p++;
        }
    }

    fclose(fin);

    return data;
}

void write_results(const char* filename, int *data, int rows, int cols)
{
    FILE* fout;
    int* p;
    int i, j;

    fout = fopen(filename, "w");
    if (!fout) {
        printf("Cannot open output file.\n");
        exit(1);
    }

    p = data;
    for (i = 0; ifor (j = 0; jfprintf(fout, "%d ", *p);
            p++;
        }
        fprintf(fout, "\n");
    }
    fclose(fout);
}



int main(int argc, char** argv)
{
    float* dataset;
    float* testset;
    int nn;
    int* result;
    float* dists;
    struct FLANNParameters p;
    float speedup;
    flann_index_t index_id;

    int rows = 9000;
    int cols = 128;
    int tcount = 1000;

    /*
    * The files dataset.dat and testset.dat can be downloaded from:
    * http://people.cs.ubc.ca/~mariusm/uploads/FLANN/datasets/dataset.dat
    * http://people.cs.ubc.ca/~mariusm/uploads/FLANN/datasets/testset.dat
    */
    printf("Reading input data file.\n");
    dataset = read_points("dataset.dat", rows, cols);
    printf("Reading test data file.\n");
    testset = read_points("testset.dat", tcount, cols);

    nn = 3;
    result = (int*)malloc(tcount*nn * sizeof(int));
    dists = (float*)malloc(tcount*nn * sizeof(float));

    p = DEFAULT_FLANN_PARAMETERS;
    p.algorithm = FLANN_INDEX_KDTREE;
    p.trees = 8;
    p.log_level = FLANN_LOG_INFO;
    p.checks = 64;

    printf("Computing index.\n");
    index_id = flann_build_index(dataset, rows, cols, &speedup, &p);
    flann_find_nearest_neighbors_index(index_id, testset, tcount, result, dists, nn, &p);

    write_results("results.dat", result, tcount, nn);

    flann_free_index(index_id, &p);
    free(dataset);
    free(testset);
    free(result);
    free(dists);

    system("pause");
    return 0;
}

切换到debug X64平台,打开【视图】→【其他窗口】→【属性管理器】,右键【Debug | x64】选择【新建属性表】,新建一个名为:FLANN_1.8.4_VS2015_DEBUG_X64.props的属性表。
3、打开刚才新建的属性表,在【VC++目录】中填入FLANN的include文件夹和lib文件夹:
【包含目录】:E:\PCL_dependencies\flann-1.8.4\include
【库目录】:E:\PCL_dependencies\flann-1.8.4\lib

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第19张图片

在【链接器】→【输入】中填入FLANN的debug版本lib文件名:flann_s-gd.lib

# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第20张图片

4、运行结果如下图所示:
# PCL1.72点云库配置:windows 64位 + VS2015 64位 + boost1.62.0 +Eigen3.3.1 + flann1.8.4 +_第21张图片


  1. http://www.cnblogs.com/oloroso/p/6050596.html
    [^2]:http://stackoverflow.com/questions/12906829/failed-updating-58-targets-when-trying-to-build-boost-what-happened ↩

你可能感兴趣的:(生产工具)