ROS パッケージの CMakeList.txt でよく使用されるいくつかのコマンドの機能について——————(2)

目次

(5)catkin_package()

(6)add_library()   

(7)add_dependency( []...)


(1) ROS パッケージの CMakeList.txt でよく使われるいくつかのコマンドの機能について——————(1)_u012057432’s blog-CSDN blog に引き続き、以下にその他の関連する設定コマンドを示します。いくつかは必要ありませんが、これらは非常に一般的に使用されますが、非常に重要でもあります。

(5)catkin_package()

ROS パッケージ B が ROS パッケージ A に依存している場合、パッケージ B が find_package() 命令を使用して A を通常どおり検索し、パッケージ A の関連変数 (ヘッダー ファイル パス、ライブラリ パスなど) を取得するには、次のことが必要です。 CMakeList.txt の Catkin_package() マクロを使用して、関連する構成を作成します。このコマンド マクロは、A に関する関連情報をパッケージ B の find_package() 命令に「渡す」ことができます。つまり、パッケージ A の Catkin_package() マクロは、パッケージ B の find_package() の役割を果たします。

デフォルトの書き込みテンプレートの場合

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES pose_estimation
  CATKIN_DEPENDS pcl_conversions pcl_ros roscpp sensor_msgs
  DEPENDS system_lib
)

で:

  • INCLUDE_DIRS インクルード: パッケージ A にヘッダー ファイル フォルダーが定義されている場合、フォルダー アドレスは B の camke プロセスの変数 A_INCLUDE_DIRS として B に渡されます。
  • ライブラリpose_estimation: パッケージAで生成されたライブラリファイル(pose_estimation)のアドレスは、Bのcamkeプロセスの変数pose_estimation_LIBRARIESとしてBに渡されます。
  • CATKIN_DEPENDS pcl_conversions pcl_ros roscpp sensor_msgs: パッケージ A が依存する一部の catkin パッケージは、B で手動で再度依存することなく、B を再帰的に依存させることができます。
  • DEPENDS system_lib: パッケージ A が依存する一部の非 catkin パッケージは、 B で手動で再度依存することなく、B をそれらに再帰的に依存させることができます (ライブラリ パス、ヘッダー ファイル パスなどを再帰的に検索します)。

(6) add_library ()   

このコマンドは主にライブラリ ファイルを自分で作成するために使用され、通常は target_link_libraries の前に配置されます。具体的なコマンドは次のとおりです。

add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2] [...])

このコマンドは、gcc に指定されたソース ファイルから <name> という名前のライブラリ ファイルを生成させるために使用されます (生成される実際の名前は、システム プラットフォームに応じて異なります。たとえば、Linux では、lib<name>.a が生成されます) lib の先頭は、これがライブラリ ファイルであることをシステムに伝えます)、続く [STATIC | SHARED | MODULE] は、「静的ライブラリ」、「動的ライブラリ」、および「モジュール ライブラリ?」を生成することを意味します (このモジュール ライブラリは静的にリンクされませんが、dlopen などのメソッドを通じて動的にロードされる可能性があります。これはわかりません)。どちらであるかを明示的に指定しない場合は、BUILD_SHARED_LIBS (それ自体が cmake フラグ変数であり、特に add_library の生成タイプを指定するために使用されます) の値が ON か OFF に基づいて決まります。ON は、 OFF は静的ライブラリを構築することを意味します。BUILD_SHARED_LIBS の値は通常、cmake コマンドを実行するときに指定されます。たとえば、次のコマンドを実行するときです。

cmake -DBUILD_SHARED_LIBS=OFF ..

BUILD_SHARED_LIBS の値が指定されていない場合、デフォルトは OFF であるため、[STATIC | SHARED | MODULE] パラメーターが指定されていない場合は、デフォルトで静的ライブラリがビルドされます。

例:

### Build simple_grasping library
add_library(simple_grasping
  src/cloud_tools.cpp
  src/object_support_segmentation.cpp
  src/shape_extraction.cpp
  src/shape_grasp_planner.cpp
)

上では、独自の src に main 関数が含まれていない cpp ファイルが静的ライブラリに組み込まれていますが、合理的で興味深いのは、このライブラリが target_link_libraries 命令を使用して、main 関数を含む独自の cpp ターゲット ファイルとリンクできることです。したがって、add_executable に cpp 固有の名前を大量に記述することを避けることができます。

より完全な例:

### 构建名为simple_grasping的静态库,此语句之后,gcc就会把它们编译成二进制文件
add_library(simple_grasping
  src/cloud_tools.cpp
  src/object_support_segmentation.cpp
  src/shape_extraction.cpp
  src/shape_grasp_planner.cpp
)
###把库的目标文件和外部库文件进行链接,这样才能构建出完整的库?
###刚试了一下,并不需要进行链接外部的库,因为它只是被用到了下面与basic_grasping_perception进行链###接,可以在后面一起链接
target_link_libraries(simple_grasping
  ${Boost_LIBRARIES}
  ${catkin_LIBRARIES}
  ${PCL_LIBRARIES}
)
### 自己的main目标文件,注意没有其他的cpp文件,而是用库代替了,很方便
add_executable(basic_grasping_perception src/basic_grasping_perception.cpp)
###看到,在这里把自己的simple_grasping库和外部的库,以及main目标文件进行了链接。
target_link_libraries(basic_grasping_perception
  simple_grasping
  ${Boost_LIBRARIES}
  ${catkin_LIBRARIES}
  ${PCL_LIBRARIES}
)

(7)add_dependency(<ターゲット> [<ターゲットの依存関係>]...)

これは通常、target_link_libraries の後に配置され、主に、トップレベルのターゲット (このターゲット) が別のトップレベルのターゲット (<target-dependency>) に依存することを cmake に伝え、依存する <target-dependency> がこのターゲットの前にビルドされるようにします。 . 完了しました。

いわゆるトップレベルのターゲット値は、add_executable()、add_library()、または add_custom_target() 命令によって作成されたターゲット オブジェクトです。一般に、このコマンドは、別の自己記述パッケージを確実に実行するために使用されると単純に理解できます。 B はこのパッケージ A より前にビルドされます。

おすすめ

転載: blog.csdn.net/u012057432/article/details/103353547