読者です 読者をやめる 読者になる 読者になる

聞きかじりめも

主にC++やメディア処理技術などに関して気付いたことを書いていきます.ここが俺のメモ帳だ!

PCLのリンカスクリプト"PCLAdapter.h"


コーディング関連の記事を書くためのブログなのに載せるの2回目という...

最近になってPCL(Point Cloud Library)の勉強を始めました.日本語資料が少なくて大変なこのライブラリ,まともにプロジェクトに入れようとするとlibファイル多すぎてやってらんないので,みんなで使える便利なリンカスクリプトを作ってみました.

ちなみに自分のビルド環境は,

です.特にPCLが他のバージョンだとlibファイルのディレクトリや名前が変わってたりするので注意. x64の場合は環境変数を変えれば動くと思う.

(2015/09/08追記)下のソースコードの内容を変更しました.

  • リンクし忘れていたライブラリを追加
  • #pragma regionによるコードの簡素化
  • C4996対策の変更

使い方

  1. 以下のコードをコピーして.hで保存する.
  2. 環境変数PCL_INCPCL_LIBを追加し,コメントに記載された値をコピペする.
  3. VisualStudioを起動している場合はVSを一旦再起動する.
  4. プロジェクトのプロパティで,「追加のインクルードディレクトリ」に&(PCL_INC)を,「追加のライブラリディレクトリ」に&(PCL_LIB)をそれぞれ追加する.
  5. PCLを使いたいコードにインクルードする.
  6. PCLAdapter.h 内の#includeは必要に応じて追加,削減する.

ここではすべてのライブラリをリンクしていますが,プログラムを軽くしたいなどの事情がある場合は不要なライブラリをコメントアウトしましょう.ただし,どうやらboostは必須で,特徴点検出をしたい場合はflannを入れないと動かないようです.

PCLを使う上での注意点

自分ではまってしまった箇所のメモ書き.ソースコードはこの下です.

「flannがあいまいです」

OpenCVを使っている場合,

using namespace cv;

を使うコーディングだと,こんな風に怒られてコンパイルが通らないことがあります.これはエラー文の通り,cv::がないせいでPCLのサードパーティ内のflann::OpenCVcv::flann::が競合してしまうためです.これを解決するには,PCLのflannを使う可能性のある場所でusing namespace cv;が効かないようにすると良いです.例えばOpenCVのみを使う.cpp内でのみ名前空間の省略を効かせるようにするとか.

ライブラリ内に潜む罠

自分が使ったPCLのバージョンでは,幾つかのライブラリでfopen()が使われているせいで,セキュリティにうるさいVC++コンパイラちゃんはここぞとばかりにfopen_s()を推しながら

えーマジー?fopen()ー!?

キモーい!

fopen()が許されるのはVC2006までだよねー

キャハハハハハ!

と罵ってきます(嘘).こいつらを黙らせるにはライブラリを書き換える以外にも,プロジェクトのプロパティで「C/C++ -> 詳細設定 -> 指定の警告を無視する」に4996を入れてerror:C4996を無視させるやり方があります.一応大丈夫なはず.

(2015/09/08追記)もっといいやり方が見つかりました.VC++コンパイラにセキュリティ対策を自動でやってもらう方法です.(引用元: ☆PROJECT ASURA☆ [OpenGL] 『メッシュを読み込む!!(1) 〜OBJファイル〜』

#pragma region Disable Waring C4996
//
// Disable Warning C4996
//
#ifndef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#endif
#ifndef _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
#endif
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS 1
#endif
#pragma endregion

このようにすると,fopen()fopen_s()に自動で書き直されるみたいです.めっちゃ便利.

PCLAdapter.h

//------------------------------------------------------------
//     Point Cloud Library Adapter (Library Linker)
//------------------------------------------------------------

/*
   pclを利用するためのリンカスクリプト
   includeは必要なものを書き足していく

   環境変数設定 (PCL v1.7.2 32bit vc120)

   $(PCL_INC) =
       C:\Program Files (x86)\PCL 1.7.2\include\pcl-1.7;
       C:\Program Files (x86)\PCL 1.7.2\3rdParty\Boost\include\boost-1_57;
       C:\Program Files (x86)\PCL 1.7.2\3rdParty\Eigen\eigen3;
       C:\Program Files (x86)\PCL 1.7.2\3rdParty\FLANN\include;
       C:\Program Files (x86)\PCL 1.7.2\3rdParty\Qhull\include\libqhullcpp;
       C:\Program Files (x86)\PCL 1.7.2\3rdParty\VTK\include\vtk-6.2;

   $(PCL_LIB) = 
       C:\Program Files (x86)\PCL 1.7.2\lib;
       C:\Program Files (x86)\PCL 1.7.2\3rdParty\Boost\lib;
       C:\Program Files (x86)\PCL 1.7.2\3rdParty\FLANN\lib;
       C:\Program Files (x86)\PCL 1.7.2\3rdParty\Qhull\lib;
       C:\Program Files (x86)\PCL 1.7.2\3rdParty\VTK\lib;

*/


#ifndef PCLADAPTER_H_
#define PCLADAPTER_H_

#pragma region Disable Waring C4996
//
// Disable Warning C4996
//
#ifndef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#endif
#ifndef _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
#endif
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS 1
#endif
#pragma endregion

// インクルード
#pragma region Includes
#include <pcl\point_types.h>
#include <pcl\common\io.h>
#include <pcl\io\pcd_io.h>
#include <pcl\io\vtk_lib_io.h>
#include <pcl\visualization\cloud_viewer.h>          // PCLVisualizer
#include <pcl\keypoints\harris_3d.h>             // Harris特徴検出器
#include <pcl\features\fpfh.h>
#include <pcl\features\normal_3d.h>
#include <pcl/segmentation/sac_segmentation.h>       // 平面検出
#pragma endregion
// ビルドモード
#pragma region Build Mode
#ifdef _DEBUG
#define PCL_EXT_STR "_debug.lib"
#define PCL_BOOST_EXT_STR "-vc120-mt-gd-1_57.lib"
#define PCL_FLANN_EXT_STR "-gd.lib"
#define PCL_QHULL_EXT_STR "_d.lib"
#define PCL_VTK_EXT_STR "-6.2-gd.lib"
#else
#define PCL_EXT_STR "_release.lib"
#define PCL_BOOST_EXT_STR "-vc120-mt-1_57.lib"
#define PCL_FLANN_EXT_STR ".lib"
#define PCL_QHULL_EXT_STR ".lib"
#define PCL_VTK_EXT_STR "-6.2.lib"
#endif
#pragma endregion
// ライブラリのリンク(不要な物はコメントアウト)
#pragma region PCL Linker Script
#pragma comment(lib, "pcl_common"           PCL_EXT_STR)
#pragma comment(lib, "pcl_features"         PCL_EXT_STR)
#pragma comment(lib, "pcl_filters"          PCL_EXT_STR)
#pragma comment(lib, "pcl_io"               PCL_EXT_STR)
#pragma comment(lib, "pcl_io_ply"           PCL_EXT_STR)
#pragma comment(lib, "pcl_kdtree"           PCL_EXT_STR)
#pragma comment(lib, "pcl_keypoints"        PCL_EXT_STR)
#pragma comment(lib, "pcl_octree"           PCL_EXT_STR)
#pragma comment(lib, "pcl_outofcore"        PCL_EXT_STR)
#pragma comment(lib, "pcl_people"           PCL_EXT_STR)
#pragma comment(lib, "pcl_recognition"      PCL_EXT_STR)
#pragma comment(lib, "pcl_registration"     PCL_EXT_STR)
#pragma comment(lib, "pcl_sample_consensus" PCL_EXT_STR)
#pragma comment(lib, "pcl_search"           PCL_EXT_STR)
#pragma comment(lib, "pcl_segmentation"     PCL_EXT_STR)
#pragma comment(lib, "pcl_surface"          PCL_EXT_STR)
#pragma comment(lib, "pcl_tracking"         PCL_EXT_STR)
#pragma comment(lib, "pcl_visualization"    PCL_EXT_STR)
#pragma endregion
#pragma region LibBoost Linker Script
#pragma comment(lib, "libboost_atomic"      PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_chrono"      PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_container"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_context"     PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_coroutine"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_date_time"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_exception"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_filesystem"      PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_graph"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_iostreams"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_locale"      PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_log_setup"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_log"     PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_math_c99f"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_math_c99l"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_math_c99"        PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_math_tr1f"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_math_tr1l"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_math_tr1"        PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_mpi"     PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_prg_exec_monitor"        PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_program_options"     PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_random"      PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_regex"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_serialization"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_signals"     PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_system"      PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_test_exec_monitor"       PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_thread"      PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_unit_test_framework"     PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_wave"        PCL_BOOST_EXT_STR)
#pragma comment(lib, "libboost_wserialization"      PCL_BOOST_EXT_STR)
#pragma endregion
#pragma region FLANN Linker Script
#pragma comment(lib, "flann"        PCL_FLANN_EXT_STR)
#pragma comment(lib, "flann_s"      PCL_FLANN_EXT_STR)
#pragma comment(lib, "flann_cpp_s"  PCL_FLANN_EXT_STR)
#pragma endregion
#pragma region QHull Linker Script
#pragma comment(lib, "qhull"    PCL_QHULL_EXT_STR)
#pragma comment(lib, "qhull_p"  PCL_QHULL_EXT_STR)
#pragma comment(lib, "qhullcpp" PCL_QHULL_EXT_STR)
#pragma comment(lib, "qhullstatic"  PCL_QHULL_EXT_STR)
#pragma comment(lib, "qhullstatic_p"    PCL_QHULL_EXT_STR)
#pragma endregion
#pragma region VTK Linker Script
#pragma comment(lib, "vtkalglib"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkChartsCore"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkCommonColor"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkCommonComputationalGeometry"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkCommonCore"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkCommonDataModel"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkCommonExecutionModel"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkCommonMath"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkCommonMisc"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkCommonSystem"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkCommonTransforms"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkDICOMParser"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkDomainsChemistry"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkexoIIc"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkexpat" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersAMR"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersCore"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersExtraction" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersFlowPaths"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersGeneral"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersGeneric"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersGeometry"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersHybrid" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersHyperTree"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersImaging"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersModeling"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersParallel"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersParallelImaging"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersProgrammable"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersSelection"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersSMP"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersSources"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersStatistics" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersTexture"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkFiltersVerdict"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkfreetype"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkftgl"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkGeovisCore"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkgl2ps" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkhdf5_hl"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkhdf5"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkImagingColor"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkImagingCore"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkImagingFourier"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkImagingGeneral"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkImagingHybrid" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkImagingMath"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkImagingMorphological"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkImagingSources"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkImagingStatistics" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkImagingStencil"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkInfovisCore"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkInfovisLayout" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkInteractionImage"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkInteractionStyle"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkInteractionWidgets"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOAMR" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOCore"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOEnSight" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOExodus"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOExport"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOGeometry"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOImage"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOImport"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOInfovis" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOLegacy"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOLSDyna"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOMinc"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOMovie"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIONetCDF"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOParallel"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOParallelXML" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOPLY" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOSQL" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOVideo"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOXML" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkIOXMLParser"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkjpeg"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkjsoncpp"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtklibxml2"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkmetaio"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkNetCDF_cxx"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkNetCDF"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkoggtheora" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkParallelCore"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkpng"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkproj4" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingAnnotation"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingContext2D"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingContextOpenGL"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingCore" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingFreeType" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingFreeTypeOpenGL"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingGL2PS"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingImage"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingLabel"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingLIC"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingLOD"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingOpenGL"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingVolume"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkRenderingVolumeOpenGL" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtksqlite"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtksys"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtktiff"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkverdict"   PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkViewsContext2D"    PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkViewsCore" PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkViewsInfovis"  PCL_VTK_EXT_STR)
#pragma comment(lib, "vtkzlib"  PCL_VTK_EXT_STR)
#pragma endregion 

#endif // PCLADAPTER_H_