cmake — ROS C ++ catkin не находит мои пользовательские сообщения

Компилятор сообщает, что сообщения (… / 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 разжечь и собрать. Затем я возвращаю значение true и снова компилирую. Тем самым он работает нормально. Но … я могу предположить, что должно быть более элегантное / профессиональное / простое решение. Я до сих пор не могу определить причину этой проблемы. Любое решение, пожалуйста?

Я думаю, что проблема связана с порядком зависимостей … Какие? Без понятия…

0

Решение

Похоже, вы не добавляете зависимость генерации сообщений при добавлении исполняемых целей в цикле

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 работает, потому что теперь сообщения уже сгенерированы.

1

Другие решения

Похоже, что ваша зависимость 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} может помочь

1