私は、GDBデバッガkdtreeチュートリアルPCL(kdtree_search.cpp)を使用する予定。PCL、プリコンパイルされているので、ダイナミック・リンク・ライブラリにコンパイルされたモジュールをkdtreeます。GDBを使用すると、デバッグするためのダイナミックリンクライブラリを入力することはできません!
従ってkdtreeモジュール(主にkdtree_flann.hとkdtree_flann.hpp)別々にコンパイルされ、関連するコードを抽出します。ツリーコードパッケージは以下のように、
図に示す、kdtreeモジュール非常に多くのファイルに依存して、あなたは抽象化PCLのコード・レベルを見ることができ、そして再利用性は非常に良いです。
CMakeLists.txtを取り付け、
cmake_minimum_required(VERSION 2.8。3 ) プロジェクト(kdtree_learn) セット(CMAKE_BUILD_TYPE " DEBUG " ) add_definitions( -std = C ++ 11 ) find_package(PkgConfig REQUIRED) pkg_check_modules(FLANN REQUIRED) include_directories( " は/ usr / eigen3 /含ま" " /ホーム/ゴードン/ kdtree_learn / /含めます" ) add_executable($ {PROJECT_NAME} kdtree_search。CPP)
ランは、次のように与えられ、コンパイルして作ります
CMakeFiles / kdtree_learn。DIR / kdtree_search。CPPのの.o:では関数 `メイン" : /ホーム/ゴードン/ kdtree_learn / kdtree_search。CPP:27: `PCL :: KdTreeFLANNへの未定義参照<PCL :: PointXYZ、FLANN :: L2_Simple < フロート >> :: KdTreeFLANN(ブール値)" /ホーム/ゴードン/ kdtree_learn / kdtree_search。CPP:29: `PCL :: KdTreeFLANNへの未定義参照<PCL :: PointXYZ、FLANN :: L2_Simple < フロート >> :: setInputCloud(ブースト:: shared_ptrの<PCL :: PointCloud <PCL :: PointXYZ>のconst> constの&、ブースト:: shared_ptrの<のstd ::ベクトル< int型、のstd ::アロケータ<>>のconst>のconst&)" /ホーム/ゴードン/ kdtree_learn / kdtree_search。CPP:49:PCL :: KdTreeFLANN <PCL :: PointXYZ、FLANN :: L2_Simple < `の未定義参照フロート >> :: nearestKSearch(PCL :: PointXYZのconst&、INT、のstd ::ベクトル< int型、スタンダード::アロケータ< INT >>&、のstd ::ベクトル< フロート、のstd ::アロケータ< フロート >>&)constは" /ホーム/ゴードン/ kdtree_learn / kdtree_search。CPP:71: `PCL :: KdTreeFLANNに未定義の参照<PCL :: PointXYZ、FLANN :: L2_Simple < フロート >> :: radiusSearch(PCL :: PointXYZのconst&、INT、スタンダード::アロケータ< 整数 >>と、のstd ::ベクトル< フロート、のstd ::アロケータ< フロート >>と、符号なし整数)CONST ' CMakeFiles / kdtree_learn。DIR / kdtree_search。CPPの.o:では関数 `PCL :: KdTreeFLANN <PCL :: PointXYZ、FLANN :: L2_Simple < フロート >> ::〜KdTreeFLANN()" : /home/gordon/kdtree_learn/include/pcl/kdtree/kdtree_flann.h:140: `PCL :: KdTreeFLANN <PCL :: PointXYZ、FLANN :: L2_Simple <への未定義参照フロート >> ::クリーンアップ()' CMakeFiles / kdtree_learn。DIR / kdtree_search。.o :( rodata._ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE [_ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE] +。0×10): `PCL :: KdTreeFLANNに未定義の参照<PCL :: PointXYZ、FLANN :: L2_Simple < フロート >> :: setInputCloud(ブースト:: shared_ptrの<PCL :: PointCloud <PCL :: PointXYZ> CONST>のconst&、ブースト:: shared_ptrの<のstd ::ベクトル< int型、スタンダード::アロケータ< 整数 >> CONST>のconst&)' CMakeFiles / kdtree_learn。DIR / kdtree_search。CPP。の.o :( rodata._ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE [_ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE] + の0x28): `PCL :: KdTreeFLANN <PCLへの未定義参照::フロート >> :: nearestKSearch(PCL :: PointXYZのconst&、INT、のstd ::ベクトル< int型、スタンダード::アロケータ< 整数 >>と、のstd ::ベクトル< フロート、のstd ::アロケータ< フロート >>&)CONST 「 CMakeFiles / kdtree_learn。DIR / kdtree_search。CPP。の.o :( rodata._ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE [_ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE] + 0x40の): `PCL :: KdTreeFLANN <PCL :: PointXYZ、FLANN :: L2_Simple <への未定義参照フロート >> :: radiusSearch(PCL :: PointXYZのconst&、二重、 std ::ベクトル< int型、のstd ::アロケータ<>>&、のstd ::ベクトル< フロート、のstd ::アロケータ< フロート >>&、符号なし整数)constは「 CMakeFiles / kdtree_learn。DIR / kdtree_search。CPPの.o :( rodata._ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE [_ZTVN3pcl11KdTreeFLANNINS_8PointXYZEN5flann9L2_SimpleIfEEEE] +。0x58): `PCL :: KdTreeFLANN <PCL :: PointXYZ、FLANN :: L2_Simple <への未定義参照フロート >> :: setEpsilon(フロート)' エラー:collect2はLD返された1つの終了ステータス
このエラーは、明らかに、すべてのファイルがすべてここにある最も厄介な領域が、しかし、「......」に未定義の参照です。
いくつかの調査の後、我々は、kdtree_flann.hに短いコンパイル済みのコードで問題を発見しました
#ifdefのPCL_NO_PRECOMPILE 書式#include <PCL / kdtree / IMPL / kdtree_flann.hpp> #endifの
それは意味:マクロが定義されている場合、このコードはそうkdtree_flann.hppを追加するために、プリコンパイルされていません。
kdtree_flann.hはkdtree_flann.hppは、クラス実装のメンバーを定義し、KdTreeFLANNクラスを宣言しました。
私は別々にコンパイル引き出しコード、すなわち何プリコンパイルがないのこの部分ので、そこには添加kdtree_flann.hppは、特定のパスではないので、上記のエラーが発生します。
ソリューション:
でkdtree_flann.h追加 の#define PCL_NO_PRECOMPILE 。ゲット!