PCL配置即常見問題


1    下載

把與VS版本對應PCL的AllInOne包下載下來。要下對安裝包,需要了解安裝包的命名的含義,以下面的一個AllInOne包的名字為例。

PCL-1.8.0-AllInOne-msvc2013-win32.exe

其中,1.8.0表示的PCL的版本號,然后2013表示這個安裝包只適用於VS2013中使用,其它VS版本不行,最后win32表示這個安裝包只能用來開發32位的程序。

再以下面的安裝包名字為例。

PCL-1.7.2-AllInOne-msvc2012-win64.exe

這個安裝包是PCL1.7.2版本的,其只能用在VS2012上,然后使用在64位的VS項目開發中。

      注意一定要下載正確與VS版本以及想要開發的程序位數對應的AllInOne包。

下載地址:http://www.zhangzscn.com/,http://unanancyowen.com/

2    安裝

      整個安裝過程需要注意以下三點,其它默認即可:

  1. 安裝路徑最好不要包括中文;
  2. 建議勾選上“AddPCLtothesystemPATHforallusers”;
  3. 安裝時,會提示安裝OpenNI,這個建議安裝在PCL安裝路徑的3rdParty下的OpenNI2文件夾中。

3    新建

      一般在VS里創建一個C++的控制台項目,根據自己的意願設置一下項目名和路徑。在新建過程中注意以下兩點,其它默認即可:

  1. 去掉“預編譯頭(P)”前的勾
  2. 去掉“安全開發生命周期(SDL)檢查(C)”前的勾。

4    配置

      在配置項目屬性環節,需要了解的是編譯出來的程序分為兩種32位和64位。不同位數的程序需要對應版本的lib和dll才能編譯成功。這里想要編譯什么位數的程序,下載對應位數的PCL即可。不同位數的程序又分為:Debug和Release。默認生成的是Debug程序。編譯Debug版本的程序需要Debug版本的lib和dll,編譯Release版本的程序需要Release版本的lib和dll。這些lib和dll在PCL的安裝路徑路徑里有。如果需要生成上述四種程序,需要分別設置對應的項目屬性表。

根據當前需要編譯的程序位數和傳統的直接在“解決方案資源管理器”里選中項目右鍵設置項目屬性的方式,不太靈活。這里以創建屬性表的方式來配置VS。這個根據你當前需要生成的程序,往“屬性管理器”里項目下對應子項里添加屬性表,並配置屬性表相關項目,即可成功編譯PCL。

注意:VS默認只生成32位的程序,如果需要生成64的程序,方法如下:VS界面有個運行項,后面有個debug,在后面有個叫“解決方案平台”的下拉框,其值默認為win32,需要把win32,改成x64,方法是,點win32的箭頭,點“配置管理器”,點“活動解決方案平台”,點“新建”,把“鍵入或選擇新平台”,這一項,切換為x64,然后確定,此時,原來的win32已變為x64。這時編譯生成的程序就是64位版本的。

添加屬性表的話,找到“屬性管理器”,然后點擊項目的小箭頭,如果是32的程序,會出來以下兩項:Debug|Win32以及Release|Win32,而如果是64位的程序,則會多出兩項:Debug|x64以及Release|x64。選中其中一項,右鍵點擊“添加新項目屬性表”,在彈出的對話框里設置好對應的屬性表名和路徑。確認之后,在該項中就會多出一項以剛才屬性表名為名稱的屬性表。

      在新建的屬性表里,有三個必須設置的重要項目:附加包含目錄,附加庫目錄,附加依賴項。

  1. 附加包含目錄,其在項目屬性“C/C++”子項的“常規”里下,主要用來設置庫的頭文件路徑。這里設置好PCL及第三方庫的頭文件路徑。
  2. 附加庫目錄,其在項目屬性的“連接器”子項的“常規”下,主要用來設置庫的lib文件路徑。這里設置好設置PCL及第三方庫的lib文件路徑。
  3. 附加依賴項,其在項目屬性的“連接器”子項的“輸入”下,主要用來設置編譯所需的lib。這里設置好設置PCL及第三方庫的lib文件名。

只有理解里上面這三項的作用,才能學到如何去解決配置中產生的一些問題。

在配置完屬性表后,還需要配置dll。配置dll有四種方法,第一種,把dll拷貝到system32里去,第二種,把dll拷貝到編譯出來的程序的文件中,第三種,在系統的path中添加dll的路徑,本文選用第四種方法,直接配置到項目中。具體方法如下:

在“解決方案資源管理器”里選中項目右鍵點“屬性”,然后選“調試”設置環境的變量值,規則如下:

PATH=;$(PATH)

在等號后添加所有PCL及第三方庫的dll路徑以英文的“;”隔開,最后加上一個$(PATH)即可。例如我設置的如下:

PATH=$(PCL_ROOT)\bin;$(PCL_ROOT)\3rdParty\FLANN\bin;$(PCL_ROOT)\3rdParty\VTK\bin;$(PCL_ROOT)\Qhull\bin;$(PCL_ROOT)\3rdParty\OpenNI2\Tools;$(PATH)

大家根據自己的安裝路徑,靈活變通。

5    開發

完成上述步驟后,就可以把代碼拷貝到新建立的項目的cpp文件中去,然后編譯,運行。測試一下是否運行成功。測試代碼如下。

#include <pcl/visualization/cloud_viewer.h>

#include <iostream>

#include <pcl/io/io.h>

#include <pcl/io/pcd_io.h>

 

int user_data;

 

void

viewerOneOff (pcl::visualization::PCLVisualizer& viewer)

{

    viewer.setBackgroundColor (1.0, 0.5, 1.0);

    pcl::PointXYZ o;

    o.x = 1.0;

    o.y = 0;

    o.z = 0;

    viewer.addSphere (o, 0.25, "sphere", 0);

    std::cout << "i only run once" << std::endl;

 

}

 

void

viewerPsycho (pcl::visualization::PCLVisualizer& viewer)

{

    static unsigned count = 0;

    std::stringstream ss;

    ss << "Once per viewer loop: " << count++;

    viewer.removeShape ("text", 0);

    viewer.addText (ss.str(), 200, 300, "text", 0);

 

    //FIXME: possible race condition here:

    user_data++;

}

 

int

main ()

{

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);

    pcl::io::loadPCDFile ("my_point_cloud.pcd", *cloud);

 

    pcl::visualization::CloudViewer viewer("Cloud Viewer");

 

    //blocks until the cloud is actually rendered

    viewer.showCloud(cloud);

 

    //use the following functions to get access to the underlying more advanced/powerful

    //PCLVisualizer

 

    //This will only get called once

    viewer.runOnVisualizationThreadOnce (viewerOneOff);

 

    //This will get called once per visualization iteration

    viewer.runOnVisualizationThread (viewerPsycho);

    while (!viewer.wasStopped ())

    {

    //you can also do cool processing here

    //FIXME: Note that this is running in a separate thread from viewerPsycho

    //and you should guard against race conditions yourself...

    user_data++;

    }

    return 0;

}

 

6    常見問題

配置PCL的過程是比較復雜的,需要根據自己的情況靈活調整。下面就配置過程中可能會遇到的典型問題,給出其解決方案。

  1. 找不到xxx.h

這個問題是因為在設置include,即設置附加包含目錄,路徑不對或缺少導致的,根據提示,找到對應錯誤的庫的頭文件路徑,更該即可。

  1. 找不到xxx.lib

這個問題和上一個問題很像,是附加庫目錄中,路徑不對或缺少導致的,根據提示,修改對應的路徑即可。

注意:如果設置了,還是提示找不到頭文件或lib,這時就要查看一下PCL的安裝路徑下有沒有這個頭文件或lib,如果有,說明你的路徑設置的還是有問題,如果搜索不到這個頭文件,那就要修改代碼,可能是版本原因導致這個頭文件沒了,如果搜索不到lib文件,那么把這個lib從附加依賴項里刪除。

  1. 無法解析的外部符號

這個問題比較難解決,總結起來有四大原因:

  • 安裝包版本不對
  • 項目的位數和PCL庫的位數不對
  • 缺少對應的lib
  • 只有聲明,沒有定義

第一個找對安裝包即可,第二個修改項目位數和PCL庫的位數一致即可,第三個要根據經驗去添加上lib文件,第四個的話,在預處理器里添加PCL_NO_PRECOMPILE即可,當然上面只是經驗之談,要根據實際情況做出調整。

 

2.

問題描述

error C4996: ‘std::_Uninitialized_copy0’: Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ ‘Checked Iterators’ d:\program files\microsoft visual studio 12.0\vc\include\xmemory 348 1 test2

參考:http://blog.csdn.net/lanchunhui/article/details/50900367

解決方法

右鍵工程名,進入工程屬性頁,依次選中: 


 

 

編輯【預處理定義】,如錯誤提示所說,添加,_SCL_SECURE_NO_WARNINGS: 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM