Point Cloud Library (PCL) 1.8.0をソースからビルドする際、いくつかのコンパイルエラーが発生する可能性があります。本記事では、Ubuntu 20.04環境における主要なエラーとその解決方法を記述します。
前提条件とビルド手順
PCL 1.8.0のソースコードを公式リリースページから取得します。以下のコマンドで基本的なビルドプロセスを開始します。
mkdir build && cd build
cmake ..
make -j$(nproc)
コンパイルエラーと解決策
エラー1: boost::math::isnan に関連する未定義参照
現象: vlp_grabber.hのコンパイルでBoost数学ライブラリの関数が見つからないエラーが発生します。
解決策: 該当するヘッダーファイルに必要なインクルードを追加します。
// ファイル: vlp_grabber.h
// 以下のインクルード文を追加
#include <boost/math/special_functions/fpclassify.hpp>
エラー2: boost/uuid/sha1.hpp のインクルードパス問題
現象: Boost UUIDライブラリ内のSHA1ヘッダーファイルのパスが正しくありません。
解決策: pcl_visualizer.cppファイル内のインクルードパスを修正します。
// 修正前:
#include <boost/uuid/sha1.hpp>
// 修正後:
#include <boost/uuid/detail/sha1.hpp>
エラー3: shared_ptrからvectorへの不正な参照初期化
現象: plane_coefficient_comparator.hで、スマートポインタを直接参照として返そうとしているため型不一致エラーが発生します。
解決策: スマートポインタが指す実体を参照として返すように修正します。
// 修正前:
return (plane_coeff_d_);
// 修正後:
return (*plane_coeff_d_);
エラー4: LZ4圧縮関数の未定義参照
現象: kdtreeモジュールのリンク時にLZ4関連のシンボルが見つかりません。
解決策: CMakeのリンカースクリプトにlz4ライブラリを明示的に追加します。build/kdtree/CMakeFiles/pcl_kdtree.dir/link.txtファイルの末尾に以下のリンカーフラグを追加します。
-llz4
エラー5: Boost UUID 乱数生成器のコンストラクタ不一致
現象: octree_disk_container.hpp内で、Boost UUIDの乱数生成器の初期化に互換性の問題があります。
解決策: 問題を引き起こしている行を一時的にコメントアウトします。
// ファイル: octree_disk_container.hpp
// 以下の行をコメントアウト
// boost::uuids::random_generator OutofcoreOctreeDiskContainer<PointT>::uuid_gen_ (&rand_gen_);
エラー6: IntegralImageNormalEstimation の未定義参照
現象: 積分画像法を用いた法線推定クラスのメソッドがリンクできません。
解決策: 必要なヘッダーファイルをインクルードします。octree_disk_container.hppに以下の行を追加します。
#include <pcl/features/normal_3d.h>
エラー7: 認識モジュールの未定義シンボル
現象: ローカルリファレンスフレーム推定のテンプレートメソッドが未定義です。
解決策: 認識モジュールのヘッダーファイルパスを追加します。pcl-1.8.0/features/include/pcl/features/board.hに以下のインクルードを追加します(または、該当するソースファイルがこのヘッダーをインクルードしていることを確認します)。
#include <pcl/features/board.h>
インストール
全てのコンパイルエラーが解決された後、以下のコマンドでシステムにライブラリをインストールします。
sudo make install