【问题标题】:ROS C++ catkin not finding my custom messagesROS C++ catkin 找不到我的自定义消息
【发布时间】:2016-08-03 06:09:53
【问题描述】:

编译器提示找不到消息 (.../message.h)。请参阅下面的 CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(my_package)
add_compile_options(-std=c++11)


find_package(catkin REQUIRED
  COMPONENTS cv_bridge
  image_transport
  roscpp
  #rospy
  sensor_msgs
  std_msgs
  message_generation
  genmsg
  external_package
  )
find_package(nodelet REQUIRED)


#----
add_message_files( FILES
  my_message1.msg
  my_message2.msg

  )

generate_messages( DEPENDENCIES
  std_msgs sensor_msgs
  )

catkin_package(
  CATKIN_DEPENDS  message_runtime std_msgs sensor_msgs roscpp cv_bridge image_transport
  )



#******     EXTRA PACKAGES
find_package(LAPACK REQUIRED)
find_package(BLAS REQUIRED)
find_package( PkgConfig REQUIRED)
FIND_PACKAGE(Boost)
find_package( OpenCV )
include_directories(${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} )

SET(MY_FLAG ok) # OR no!!

if(MY_FLAG)
#**** exe files
set(exefiles
  file1
  file2
  )

foreach(file ${exefiles})
  add_executable(${file} ${CMAKE_CURRENT_SOURCE_DIR}/pathToExeFiles/${file}.cpp ) 
endforeach(file)


#******  Lib & link
include_directories(${SRC}/pathToMyLib)
set(MY_LIB
  lib1
  lib2
  libn
  )
endif(MY_FLAG)

foreach(file ${exefiles})
  target_link_libraries(${file2link} 
    ${MY_LIB} 
    ${MY_LIB} 
    ${MY_LIB} 
    ${catkin_LIBRARIES}
    ${Boost_LIBRARIES}
    ${gsl_LIBRARIES} ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES}
    ${OpenCV_LIBRARIES}
    )

  add_dependencies(${file} external_package_generate_messages_cpp  ${${my_package}_EXPORTED_TARGETS})
endforeach(file)


ADD_SUBDIRECTORY(src)

但是,我可以使用以下技巧进行编译。我首先将My_FLAG 设置为flase 并编译。接下来,我将其设置回 true 并再次编译。通过这样做,它工作正常。但是......我猜应该有一个更优雅/专业/直接的解决方案。到目前为止,我无法检测到此问题的原因。请问有什么解决办法吗?

我认为这个问题与依赖的顺序有关......哪个?不知道...

【问题讨论】:

    标签: c++ cmake message ros catkin


    【解决方案1】:

    在循环中添加可执行目标时,您似乎没有添加消息生成依赖项

    if(MY_FLAG)
    #**** exe files
    set(exefiles
      file1
      file2
      )
    
    foreach(file ${exefiles})
      add_executable(${file} ${CMAKE_CURRENT_SOURCE_DIR}/pathToExeFiles/${file}.cpp ) 
      add_dependencies(${file} external_package_generate_messages_cpp  ${${my_package}_EXPORTED_TARGETS})
    endforeach(file)
    ....
    

    在您的情况下最有可能发生的是,第一次运行 MY_FLAG=Off 您在实际添加依赖项的第二个 foreach 中生成消息。 MY_FLAG=On 的第二次运行有效,因为现在已经生成了消息。

    【讨论】:

    • 还是同样的问题。实际上,尝试同时删除/devel/build,然后再次尝试编译。或者,您可以尝试将您的包从/catkin-dev/src/ 移出,删除\buid 和\devel,编译,然后移回您的项目并再次尝试编译。就我而言,我必须始终在第一次编译中将标志设置为flase ....
    • 事实上,该错误与我的源问题而不是我的 exe 文件有关。事实上,我设置的标志也启用/禁用源,不仅是 exe 文件。
    【解决方案2】:

    看起来您的 EXPORTED_TARGETS 依赖项是错误的。

    add_dependencies(${file} external_package_generate_messages_cpp  ${${my_package}_EXPORTED_TARGETS})
    

    ${${my_package}_EXPORTED_TARGETS} 应该是 ${${PROJECT_NAME}_EXPORTED_TARGETS}${my_package_EXPORTED_TARGETS}

    所以:

    add_dependencies(${file} external_package_generate_messages_cpp  ${${PROJECT_NAME}_EXPORTED_TARGETS})
    

    如果不依赖 ${catkin_EXPORTED_TARGETS} 可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多