Acerca de las funciones de varios comandos de uso común en CMakeList.txt en el paquete ROS——————(2)

Tabla de contenido

(5)paquete_catkin()

(6)agregar_biblioteca()   

(7)agregar_dependencias( []...)


Continuando con (1) Con respecto a las funciones de varios comandos de uso común en CMakeList.txt en el paquete ROS——————(1)_u012057432blog-CSDN blog , los siguientes son otros comandos de configuración relacionados, algunos no son necesarios, pero Son muy utilizados, pero también muy importantes.

(5)paquete_catkin()

Si el paquete B de ROS depende del paquete A de ROS, entonces para que el paquete B use la instrucción find_package() para encontrar A normalmente y obtener las variables relevantes del paquete A (ruta del archivo de encabezado, ruta de la biblioteca, etc.), necesita estar en el paquete A de antemano. Utilice la macro Catkin_package() en CMakeList.txt para realizar configuraciones relevantes. Esta macro de comando puede "pasar" la información relevante sobre A a la instrucción find_package() del paquete B. En otras palabras, la macro Catkin_package() del paquete A sirve al find_package() del paquete B.

Para la plantilla de escritura predeterminada

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

en:

  • INCLUDE_DIRS incluye: si hay una carpeta de archivos de encabezado definida en el paquete A, la dirección de la carpeta se pasará a B como la variable A_INCLUDE_DIRS en el proceso de camke de B.
  • BIBLIOTECAS pose_estimation: la dirección del archivo de biblioteca (pose_estimation) generado en el paquete A se pasa a B como la variable pose_estimation_LIBRARIES en el proceso de camke de B.
  • CATKIN_DEPENDS pcl_conversions pcl_ros roscpp sensor_msgs: Algunos paquetes catkin de los que depende el paquete A pueden hacer que B dependa recursivamente de ellos sin tener que volver a depender manualmente de ellos en B.
  • DEPENDE system_lib: Algunos paquetes no catkin de los que depende el paquete A pueden hacer que B dependa recursivamente de ellos (busque recursivamente sus rutas de biblioteca, rutas de archivos de encabezado, etc.) sin tener que volver a depender manualmente de ellos en B.

(6) agregar_biblioteca ()   

Este comando se utiliza principalmente para crear archivos de biblioteca usted mismo. Generalmente se coloca antes de target_link_libraries. El comando específico es

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

Este comando se utiliza para hacer que gcc genere un archivo de biblioteca llamado <nombre> a partir del archivo fuente especificado (el nombre real generado tendrá nombres diferentes según la plataforma del sistema. Por ejemplo, en Linux, se generará lib<nombre>.a al comienzo de lib le dice al sistema que se trata de un archivo de biblioteca), y lo siguiente [ESTÁTICO | COMPARTIDO | MÓDULO] significa que desea generar una "biblioteca estática", una "biblioteca dinámica" y una "biblioteca de módulos". Esta biblioteca de módulos no estará vinculada estáticamente, pero se puede cargar dinámicamente mediante métodos como dlopen (no lo entiendo). Si no marca explícitamente cuál es, se basará en el valor de BUILD_SHARED_LIBS (en sí misma una variable de indicador de cmake, utilizada específicamente para especificar el tipo de generación de add_library), ya sea que esté activado o desactivado. ON significa construir un biblioteca dinámica y APAGADO significa construir bibliotecas estáticas. El valor de BUILD_SHARED_LIBS generalmente se proporciona al ejecutar el comando cmake. Por ejemplo, al ejecutar:

cmake -DBUILD_SHARED_LIBS=OFF ..

Si no se especifica el valor de BUILD_SHARED_LIBS, el valor predeterminado es OFF. Por lo tanto, cuando no se especifica el parámetro [STATIC | SHARED | MODULE], la biblioteca estática se construye de forma predeterminada.

ejemplo:

### 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
)

Arriba, el archivo cpp que no contiene la función principal en su propio src está integrado en una biblioteca estática. Lo que es razonable e interesante es que esta biblioteca puede usar la instrucción target_link_libraries para vincularse con su propio archivo de destino cpp que contiene la función principal. , por lo que puedes evitar escribir un montón de nombres específicos de cpp en add_executable.

Un ejemplo más completo:

### 构建名为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_dependencies(<destino> [<destino-dependencia>]...)

Esto generalmente se coloca después de target_link_libraries. Principalmente le dice a cmake que un objetivo de nivel superior (este objetivo) depende de otro objetivo de nivel superior (<target-dependency>) para garantizar que la <target-dependency> dependiente se construya antes de este objetivo. .completo.

El llamado valor objetivo de nivel superior es el objeto de destino creado por las instrucciones add_executable(), add_library() o add_custom_target(). En términos generales, se puede entender simplemente que este comando se utiliza para garantizar que otro paquete escrito por usted mismo B se construye antes que este paquete A. .

Supongo que te gusta

Origin blog.csdn.net/u012057432/article/details/103353547
Recomendado
Clasificación