Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ROS C++;柳絮找不到我的自定义消息_C++_Cmake_Message_Ros_Catkin - Fatal编程技术网

C++ ROS C++;柳絮找不到我的自定义消息

C++ ROS C++;柳絮找不到我的自定义消息,c++,cmake,message,ros,catkin,C++,Cmake,Message,Ros,Catkin,编译器正在告知未找到消息(…/message.h)。请参阅下面的my 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_

编译器正在告知未找到消息(…/message.h)。请参阅下面的my 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和compile。接下来,我将其设置回true并再次编译。这样做效果很好。但是我猜应该有一个更优雅/专业/直接的解决方案。到目前为止,我无法检测出这个问题的原因。有什么解决办法吗


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

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

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的第二次运行有效,因为现在已经生成了消息

看起来您导出的\u目标依赖项是错误的

add_dependencies(${file} external_package_generate_messages_cpp  ${${my_package}_EXPORTED_TARGETS})
${{my\u package}{u EXPORTED\u TARGETS}
应该是
${{PROJECT\u NAME}{u EXPORTED\u TARGETS}
${my\u package\u EXPORTED\u TARGETS}

因此:


如果对
${catkin\u EXPORTED\u TARGETS}
的依赖性失败,可能会有所帮助。

仍然存在同样的问题。实际上,请尝试删除
/devel
/build
,然后再次尝试编译。或者,您可以尝试将包从
/catkin dev/src/
中移出,删除\buid和\devel,编译,然后移回项目并再次尝试编译。在我的例子中,我必须在第一次编译时将标志设置为flase…事实上,错误与我的源代码相关,而不是与我的exe文件相关。事实上,我设置的标志还启用/禁用源,而不仅仅是exe文件。
add_dependencies(${file} external_package_generate_messages_cpp  ${${PROJECT_NAME}_EXPORTED_TARGETS})