# 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

如下圖所示:

bootstrap.bat
執行成功後會在目錄下生成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分鐘。

編譯結果如下:

這裏寫圖片描述

注意到裏面有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。

2.5 測試

打開VS2015,新建一個控制檯程序,新建一個.cpp文檔,寫入一下代碼(來源):

// main.cpp
#include <boost/lexical_cast.hpp>     
#include <iostream>     
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的屬性表。

props

打開剛纔新建的屬性表,在【VC++目錄】中填入boost的include文件夾和lib文件夾:
【包含目錄】:E:\PCL_dependencies\Boost\include\boost-1_62;
【庫目錄】:E:\PCL_dependencies\Boost\lib;

include

在【鏈接器】→【輸入】中填入boost 的debug版本*.lib文件名:
lib

完整.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

編譯運行,結果如下表示成功:

cg

值得一提的是,剛纔新建的屬性表可以保存起來,以後如果在項目中用到boost,則可以在【屬性管理器】中添加剛纔新建的屬性表,省去每次配置屬性表的麻煩。

三、Eigen 編譯

Eigen3.3.1的編譯基本按照這裏的步驟。

3.1 下載源碼

Eigen官網下載Eigen3.3.1源碼

download,解壓。

3.2 構建工程

使用cmake構建Eigen的VS2015編譯工程。打開cmake-gui.exe,設置源碼路徑(就是包含”CMakeLists.txt”的路徑)和構建路徑,本文設置如下:

src

勾選CMake界面上的 【Grouped】和 【Advanced】,Grouped是對配置分組,Advanced是顯示高級配置。

ga

點擊【Configure】,選擇VS2015 64位編譯器。

這裏寫圖片描述

等待CMake把配置生成完畢後,就需要對CMake自動生成的配置進行修改.所有紅色顯示的配置,都是需要用戶確認的配置或者有問題的配置,在默認配置上進行如下修改:
修改CMAKE_INSTALL_PREFIX值爲:E:\PCL_dependencies\Eigen3.3.1。這個目錄可以自行指定,當Eigen編譯完成後,安裝時,會將Eigen安裝到指定的目錄,強烈建議修改此目錄.

這裏寫圖片描述

再次點擊【Configure】後點擊【generate】,結果如下圖所示。

bd

3.3 編譯源碼

用VS2015打開F:\compile\eigen-eigen-f562a193118d\build目錄下的Eigen3.sln解決方案。

這裏寫圖片描述

確保ALL_BUILD爲啓動項目(如果沒出問題,它應該就是啓動項目)。選擇ALL_BUILD項目,點擊生成。

這裏寫圖片描述

然後選擇INSTALL安裝。安裝完成,就可以在之前設置的prefix目錄下.在E:\PCL_dependencies將看到安裝之後的Eigen。

這裏寫圖片描述

注:Eigen不會生成二進制文件,只生成頭文件,所以無所謂debug或release配置.

3.4 測試

用VS2015創建一個控制檯運用程序,寫入以下代碼(來源):

#include <iostream>  
#include <Eigen/Dense>  
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配置都一樣.

成功運行結果如下:

cg

四、flann 編譯

4.1 源碼編譯

flann官網或者flann的github主頁下載最新版源碼,推薦從GitHub下載,不然會出現下面第6點錯誤,GitHub上已修復該bug。
flann的編譯與Eigen編譯過程基本一樣。需要注意到是第4點和第6點
步驟如下:

1.cmake-gui.exe,設置源碼路徑和構建路徑,本文設置如下:

這裏寫圖片描述

2.點擊【Configure】,選擇VS2015 64位編譯器。

這裏寫圖片描述

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有錯誤:

error

雙擊錯誤,即可打開該頭文件,然後在第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 <flann/flann.h>
#include <stdio.h>
#include <stdlib.h>

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; i<rows; ++i) {
        for (j = 0; j<cols; ++j) {
            fscanf(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; i<rows; ++i) {
        for (j = 0; j<cols; ++j) {
            fprintf(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

include

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

lib

4、運行結果如下圖所示:
result

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章