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